我希望在版本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",
}
}
}
}
]
}
答案 0 :(得分:2)
正确的表示法是
Errors[0].Version1[0] // however still won't work
因为你的json中有一个额外的数组包装器并且你混合了符号
但是,它们的索引无法访问对象属性,因为它们的顺序无法保证。因此,您需要将Version1
和Version2
转换为数组,或者必须按名称访问属性。
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;
变得简单。