遍历JSON以获取孩子的名字

时间:2012-11-05 23:05:07

标签: javascript json

我希望在版本1和版本2下获得子名称。以下示例中的子名称为“客户”和“发票”。

我如何使用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",

          }
        }
      }
    }
  ]
}

3 个答案:

答案 0 :(得分: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",

          }
        }
      ]
    }
}

作为一个数组,订单保证是固定的,但是你丢失了信息客户,因为数组没有键但只有索引。

答案 1 :(得分: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];
}

但是,我建议使用一个库(Underscore或jQuery都有自己的“每个”函数)而不是本机JS,因为如果你使用任何添加自定义属性的库,它们就会搞砸了。

答案 2 :(得分: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;

变得简单。