【问题标题】:Parsing nested JSON in Nodejs在 Nodejs 中解析嵌套的 JSON
【发布时间】:2016-08-23 06:49:00
【问题描述】:

我一直在尝试解析嵌套的 JSON 数据,下面是我的代码

var string = '{"key1": "value", "key2": "value1", "Key3": {"key31":"value 31"}}';
var obj = JSON.parse(string);
console.log(obj.key1)
console.log(obj[0]);

这是输出

$ node try.js 
value
undefined

为什么我的 obj[0] 未定义?在这种情况下如何获取值,以及嵌套键key31

更新 现在在@SergeyK 和其他人的帮助下,我将上面的代码修改如下

var string = '{"key1": "value1", "key2": "value2", "key3": {"key31":"value 31"}}';

var obj = JSON.parse(string);
var array = Object.keys(obj)

for (var i = 0; i < array.length; i++) {
    console.log(array[i], obj[array[i]]);
}

输出如下

$ node try.js 
key1 value1
key2 value2
key3 { key31: 'value 31' }

但是对于{"key31":"value 31"},我将如何访问密钥key31 并获取其值value 31

【问题讨论】:

  • 您希望obj[0] 有什么价值?
  • 它是一个散列,而不是一个数组。当您写obj[0] 时,您期望什么?
  • JSON Objects ({ ... }) 使用基于键的索引,这意味着如果你想获得"value",你需要通过它的键来引用它:obj["key1"]obj.key1,在使用 Arrays 时只能使用数字索引:[ .. ]

标签: javascript json node.js nested


【解决方案1】:

您只是无法通过索引访问命名对象属性。你可以使用obj[Object.keys(obj)[0]]

编辑:

正如@smarx 在 cmets 中解释的那样,由于Object.keys 是无序的,因此此答案不适合通过索引直接访问特定属性,因此仅适用于需要循环对象的键/值的情况.

示例:

var string = '{"key1": "value", "key2": "value1", "Key3": {"key31":"value 31"}}';
var obj = JSON.parse(string);
var keysArray = Object.keys(obj);
for (var i = 0; i < keysArray.length; i++) {
   var key = keysArray[i]; // here is "name" of object property
   var value = obj[key]; // here get value "by name" as it expected with objects
   console.log(key, value);
}
// output:
// key1 value
// key2 value1
// Key3 { key31: 'value 31' }

【讨论】:

  • 我不认为Object.keys 保证任何特定的顺序,因此无法预测您将在此处访问哪个键,对吧? (所以我看不出这段代码有什么用处。)
  • 如果我没有任何误解,问题中没有关于订购的内容。适用于循环槽对象属性,用于“获取价值”,不适用于直接访问特定属性。
  • 您共享的 sn-p 将给出对象的随机值。 (在无法预测的意义上是随机的。)你真的认为这会对提出这个问题的人有所帮助吗?
  • 我分享的片段只是展示了如何按照请求访问值。您也可以使用Object.keys(obj)[0] 一个键名,这取决于您要做什么,对吧?
  • 如何循环 JSON 对象的键值,因为我将获取 JSON 对象并且不知道键名
【解决方案2】:

当您尝试访问时

 console.log(obj[0]);

您实际上是在尝试在数组中的第一个内存位置引用元素,但 var string 是哈希而不是数组。 这就是为什么你会收到undefined

【讨论】:

  • 你的意思是“obj 是一个对象而不是一个数组。” stringstring。 :-)
  • 对不起,将json视为数组是我的错误
【解决方案3】:

console.log(obj[0]) 只有当 obj 是一个数组时才会显示它的值。例如:

var obj = ["value","value2"];
console.log(obj[0]) --> value

对于一个对象,你需要使用键作为标识符。

对于嵌套键 key31:

console.log(obj.Key3.key31) --> value 31

希望对你有所帮助

【讨论】:

    【解决方案4】:

    console.log(obj[0]); 提供undefined 因为obj is not an arrayobj[0] 仅在 obj 是数组时才有效,因为我们正在从数组中访问 first index 元素。

    示例:

    var obj = ["val1","val2","val3"];
    
    console.log(obj[0]); // val1
    

    根据要求:

    var string = '{"key1": "value", "key2": "value1", "Key3": {"key31":"value 31"}}';
    var obj = JSON.parse(string);
    var keyArray = Object.keys(obj); // key1
    console.log(obj[(keyArray[0])]); // value
    

    工作小提琴:

    https://jsfiddle.net/kbwbspnk/

    对于嵌套属性值,您必须使用 . 运算符。

    console.log(obj.Key3.key31); // value 31
    

    【讨论】:

    • 谢谢罗希特。实际上我会得到一个 JSON 对象,但我不知道键名。
    • @JoelDivekar 好的,根据您的要求,您可以尝试此解决方案。
    【解决方案5】:

    我不知道你想让 obj[0] 做什么,所以我无能为力。

    要获取 key31 的值,请使用 obj.Key3.key31,记录时应生成 value 31

    【讨论】:

    • 这是我的错误 smarx,因为我将 JSON 对象视为数组
    【解决方案6】:

    在上述情况下,您的变量(字符串)不是其对象的数组,并且您无法使用 0,1,2... 之类的索引访问它,您可以使用其键值名称访问它,例如 key1,key2...

    示例: 对象['key1'] 美元价值 obj['Key3']['key31'] $ 价值 31

    【讨论】:

    • 我认为你的意思是“obj 不是一个数组。它是一个对象。” (stringstring。)
    猜你喜欢
    • 1970-01-01
    • 2021-07-27
    • 2015-02-20
    • 2018-09-12
    • 2016-07-23
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多