2016-09-28 59 views
2

我有一个JSON对象格式化像{"Foo": ["B","A","R"]}访问JSON对象的一个​​数组里面从齐磊

我试图访问数组的值是这样的:

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,我不太清楚为什么。JSON还有其他值,我可以访问很好,但他们不是阵列。任何洞察力将不胜感激。谢谢!

+0

这是你的实际代码? 'value'!=='Valid' –

+0

你有JSON结构的问题var json ='{“Foo”:[“B”,“A”,“R”]}';双引号和单引号冲突 – Gary

+0

它不是我的实际代码,实际的代码与其余的JSON值一起工作,但不是与数组一起使用的代码。 – MrPickle

回答

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

我试图将它解析为一个对象,以便我可以将它们带入并基于JSON所拥有的内容构建另一个对象,这是有道理的。不过,我会尝试没有回调。谢谢! – MrPickle

+1

这不回答为什么原始代码不起作用的问题。 – 2016-09-28 04:27:56

+0

@torazaburo确实没有,但IMO的问题是不应该使用回调来简单地读取JSON对象。答案不一定是*回答字面问题*,它是关于*解决问题*,我认为我的答案试图去做。 – Frxstrem

0

使用此代码

var json = {'foo' : ['B', 'A', 'R']}; 
    $.each(json, function(key, value){if(key == 'foo'){console.log(value[1]);}}); 

你已经有一个JSON对象,所以没有需要再次解析它。

+0

我实际上是从文件中读取它,这就是为什么我必须解析它。 – MrPickle

+0

什么是'$ .each'?什么是“JSON对象”?由于'json'是一个字符串,为什么他不需要解析它? – 2016-09-28 04:23:27

+0

大声笑jQuery在2016 ..只需使用内置的Object.keys/Object.entries和.forEach或.map。 – cchamberlain

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; 
    ^^^^^^^^^^^^^ 
}); 
0

它出现的原因你不能访问value [1],但你可以访问value.length(你提到user663031)你没有返回值。

reviver函数将一个值替换为另一个值,如果没有指定返回值,则所有函数都将返回undefined。 reviver接收值的顺序是:首先分别在数组中的每个值,然后是数组。

在您的代码中,每个值已被替换为“未定义”,所以数组有三个未定义的值,如长度报告。 value[1]确实正在返回位置1处的值,但它被设置为“未定义”。