从reviver访问JSON对象内部的数组

时间:2016-09-28 03:08:37

标签: javascript arrays json node.js

我有一个格式为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}}我能够访问得很好,但它们不是数组。任何见解将不胜感激。谢谢!

5 个答案:

答案 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”}]}

https://jsfiddle.net/pdorgambide/vphbmtk1/