2012-11-05 29 views
0

我想要得到版本1和版本2下的孩子的名字。以下儿童的名字的例子是“客户”和“发票”。穿越JSON得到孩子的名字

我怎样才能得到它使用JavaScript?

我试过Errors.Version1。[0]得到的名字,但似乎没有工作。我不想使用Errors.Version1.Customer,因为它可以更改。它可以是“客户”或“发票”。我只想得到它的名字。

谢谢!

JSON例如

{ 
    "Errors": [ 
    { 
     "Version1": { 
     "Customer": { 
      "BillAddr": { 
      "Id": "Id1", 
      "Line1": "Line11", 
      "Line2": "Line21", 
      "Line3": "Line31", 
      "Line4": "Line41", 
      "Line5": "Line51", 
      "City": "City1", 

      } 
     } 
     }, 
     "Version2": { 
     "Invoice": { 
      "BillAddr": { 
      "Id": "Id1", 
      "Line1": "Line11", 
      "Line2": "Line21", 
      "Line3": "Line31", 
      "Line4": "Line41", 
      "Line5": "Line51", 
      "City": "City1", 

      } 
     } 
     } 
    } 
    ] 
} 

回答

1

如果它永远只能是一个或另一个,那么就做一个简单的测试:

var type = ("Customer" in Errors[0].Version1) ? "Customer" : "Invoice", 
    obj = Errors[0].Version1[type]; 

如果它不只是这两个可能的结果更有活力,那么你就需要通过做for ... in迭代对象的键。也就是说,如果你有这种数据格式的100%所有权,并且有能力改变它,我可能会建议删除一个级别,而不是给出错误error_type属性,而不是试图猜测它?

{ 
    Errors : [{ 
     Version1 : { 
      ErrorType : "Customer", 
      BillAddr : { 
       Id : "Id1", 
       Line1 : "Line11", 
       Line2 : "Line21", 
       Line3 : "Line31", 
       Line4 : "Line41", 
       Line5 : "Line51", 
       City : "City1" 
      } 
     }, 

     Version2 : { /* ... */ } 
    }] 
} 

或者,你可以把VersionX一个数组,而不是一个对象,并为此,你可以有多个错误,持有对象(用自己的错误类型属性),此时,盘算通过:

Errors[0].Version1[0].ErrorType; 

变得非常简单。

2

正确的符号是

Errors[0].Version1[0] // however still won't work 

因为你在你的JSON有一个额外的阵列封装和你混的符号。
但是,对象属性不能被索引访问,因为它们的顺序不能保证。因此,您需要将Version1Version2转换为数组,或者必须按名称访问属性。

Errors[0].Version1["Customer"] //works for your current markup 

此外,使用点符号object.property括号符号object["property"] - 你不能混用。

下面将为您的符号Errors.Version1[0]工作:

{ 
    "Errors": 
    { 
     "Version1": [ 
     { 
      "BillAddr": { 
      "Id": "Id1", 
      "Line1": "Line11", 
      "Line2": "Line21", 
      "Line3": "Line31", 
      "Line4": "Line41", 
      "Line5": "Line51", 
      "City": "City1", 

      } 
     } 
     ] 
    } 
} 

作为阵列的顺序是保证固定的,但你失去了信息的客户,因为数组没有钥匙,但只有指标。

2

不能将对象属性引用为索引;换句话说,你不能这样做:

var foo = {a:1}; 
foo[0]; // Doesn't work 

什么可以做,虽然是使用类似的语法作为索引引用属性:

var foo = {a:1}; 
foo[someBoolean ? 'Customer' : 'Invoice']; // Does work 

但是,如果你只是想获得的任何属性的一个对象,不管它们被命名了什么?好吧,那么你需要通过他们迭代:

var foo = {randomName:1}; 
for (var key in foo) { 
    // key=="randomName" 
    // foo[key]==foo["randomName"]==foo.randomName==1 
    // do whatever you want with foo[key]; 
} 

不过,我建议使用库(包括下划线或jQuery的有自己的“每个”功能),而不是原生JS,因为如果你使用任何图书馆添加自定义属性,他们可以搞砸了。

+1

所以然后使用'foo.hasOwnProperty(key)'来测试属性是否被继承。 –

+0

只是为了更具体地指出什么是机器主机,以及大卫在保护您。有些库会丰富本地Object实现,如下所示:Object.prototype.anotherKey =“whatever”。这是不考虑其他代码,在我看来是不好的,但是,这是语言的一部分。 – cbayram

+0

@cbayram这是原型继承的工作原理,您可以通过将[enumerable属性设置为false]来绕过列出的属性(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty)。 – Christoph