这可能是一个非常简单的问题,但我似乎无法使其发挥作用。
我有几个JSON行和一个notes
数组。
使用notes.push(JSONline)
我假设每个数组位置保存一个JSON行,所以按以下方式:
//notes[1]
{"id":"26","valuee":"20","datee":"2016-04-05T15:15:45.184+0100","id2":51}
//notes[2]
{"id":"27","valuee":"134","datee":"2016-04-05T15:15:47.238+0100","id2":53}
//notes[3]
{"id":"26","valuee":"20","datee":"2016-04-05T15:15:45.184+0100","id2":52}
这是我的问题:我想打印一个特定的属性,例如来自数组中一个特定JSON行的id。我怎么能这样做?
当我执行console.log(notes)
时,它会按预期打印所有JSON行。但是,如果我console.log(notes[1])
,它会在该位置打印JSON行的第一个字符,而不是整行。
同样地,console.log(notes[1].id)
不会从第一个JSON行打印id,实际上它会打印' undefined'。
我做错了什么? 非常感谢你。
答案 0 :(得分:2)
我建议您在推送笔记时解析所有json,例如:
notes.push(JSON.parse(JSONLine))
如果你以某种方式附加在数组而不是对象中的json字符串,我不建议你,你可以随时解析一旦你有jsonLine id
JSON.parse(notes[id]).id
基本上,您希望将JSON.parse用于任一解决方案,我强烈建议您在开始时将它们转换为对象。
答案 1 :(得分:1)
您需要记住JSON是JS对象的字符串表示形式。 JS字符串具有类似于数组的索引访问器方法,这就是为什么你可以编写console.log(notes[0])
并获取第一个字母的原因。
JavaScript 不允许使用对象表示法访问字符串,因此console.log(notes[0].id)
将无法正常工作,并且您获得undefined
的原因。
要使用此方法访问字符串中的数据,您需要首先将字符串解析为对象。
var notes = ['{"id":"26","valuee":"20","datee":"2016-04-05T15:15:45.184+0100","id2":51}'];
var note0 = JSON.parse(notes[0]);
var id = note0.id;
这就留下了为什么你有一个JSON字符串数组的问题。虽然它并不奇怪或不寻常,但它可能不是最佳解决方案。相反,您可以构建一个对象数组,然后对整个数据结构进行字符串化以使其易于管理。
var obj0 = {
"id": "26",
"valuee": "20",
"datee": "2016-04-05T15:15:45.184+0100",
id2: 51
};
var obj1 = {
"id": "27",
"valuee": "134",
"datee": "2016-04-05T15:15:47.238+0100",
"id2": 53
}
var arr = [obj0, obj1];
var json = JSON.stringify(arr);
输出
[
{
"id": "26",
"valuee": "20",
"datee": "2016-04-05T15:15:45.184+0100",
"id2": 51
},
{
"id": "27",
"valuee": "134",
"datee": "2016-04-05T15:15:47.238+0100",
"id2": 53
}
]
然后,您可以将JSON解析回数组并像以前一样访问它:
var notes = JSON.parse(json);
notes[0].id // 26
答案 2 :(得分:-1)
那是因为你的密钥值对中有{"id": "value"...
字符串。 "id"
是一个字符串,因此您无法像属性一样引用它。 1.使用
var notes = JSON.parse(notes);
正如阿尔法的评论中提到的那样
或删除引号尝试
{id:"26", ...}
这就是notes[i].id
返回未定义