我有一个格式为JSON
{"Foo": ["B","A","R"]}
对象
我试图像这样访问数组的值:
var json = '{"Foo": ["B","A","R"]}';
expression = JSON.Parse(json, function(key, value){
if(key == "Foo"){
console.log(value.length); // logs "3"
console.log(value[1]); // logs "undefined"
}
});
如果我要求值的长度,它返回数组的正确长度,但是如果我要求它返回undefined
的值,我不太清楚为什么。{{{}中还有其他值1}}我能够访问得很好,但它们不是数组。任何见解将不胜感激。谢谢!
答案 0 :(得分:4)
你应该像这样使用JSON.parse
:
var json = '{"Foo":["B","A","R"]}';
var object = JSON.parse(json);
// object is now and object containing the data from 'json'
var expression = object["Foo"][1]; // object["Foo"] refers to the
// value with key "Foo"
(使用回调参数调用JSON.parse
是一个高级功能,用于转换JSON对象,而不是读取它。但在几乎所有情况下,您都希望像上面的代码一样使用它,没有回调。)
答案 1 :(得分:1)
正如另一个答案中所提到的,如果你只是想要检索Foo
的第二个元素,那么在使用obj.Foo[1]
之类的标准属性访问技术进行解析后,你可以很容易地做到这一点。
假设您确实要将可选的第二个“reviver”参数用于JSON.parse
,则需要从“reviver”回调中返回值;
expression = JSON.Parse(json, function(key, value){
if (key == "Foo"){
console.log(value[1]);
}
return value;
^^^^^^^^^^^^^
});
答案 2 :(得分:0)
使用此代码
var json = {'foo' : ['B', 'A', 'R']};
$.each(json, function(key, value){if(key == 'foo'){console.log(value[1]);}});
你已经有了一个json对象,所以不需要再次解析它。
答案 3 :(得分:0)
看起来你无法访问值[1]但你可以访问value.length的原因是(如user663031所述)你没有返回值。
reviver函数将一个值替换为另一个值,如果未指定返回值,则所有函数都将返回undefined。 reviver接收值的顺序是:首先分别是数组中的每个值,然后是数组。
在您的代码中,每个值都已被“undefined”替换,因此数组有三个未定义的值,由长度报告。 value[1]
确实在第1位返回值,但它被设置为“未定义”。
答案 4 :(得分:0)
当json字符串具有数组时,将使用 index,[Object] 作为键,值参数调用reviver函数。
这段在分析阶段过滤对象属性的代码片段将很有帮助:
var json = '{"_embedded": [{"a":"A","b":"B","links": {"c":"C"}},{"a":"A2", "b":"B2","links": {"c":"C2"}}]}';
var schemaNames=["_embedded", "a"];
var result= JSON.parse(json, function(k, v) {
console.log(k,v);
if ("" === k){
return v;
}
// On arrays k is a number
else if (schemaNames.indexOf(k) > -1 || !isNaN(k)){
return v;
}
});
console.log(JSON.stringify(result));
输出:{“ _embedded”:[{“ a”:“ A”},{“ a”:“ A2”}]}