0

我想在版本 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",

          }
        }
      }
    }
  ]
}
4

3 回答 3

2

正确的符号是

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

因为您的 json 中有一个额外的数组包装器并且您混合了符号。
但是,对象属性不能通过它们的索引来访问,因为它们的顺序是不能保证的。因此,您要么需要将Version1and转换Version2为数组,要么必须按名称访问属性。

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

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

以下内容适用于您的 Notation Errors.Version1[0]

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

          }
        }
      ]
    }
}

作为一个数组,可以保证订单是固定的,但是您会失去信息客户,因为数组没有键,只有索引。

于 2012-11-05T23:28:20.203 回答
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,因为如果您使用任何添加自定义属性的库,它们可能会搞砸。

于 2012-11-05T23:28:33.613 回答
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;

变得非常简单。

于 2012-11-06T00:42:52.103 回答