JSON.parse转换为字符串而不是传入数组

时间:2016-12-17 08:43:10

标签: javascript json node.js

Yallo,我最终解释了为什么notes = JSON.parse(notesString)将我的数组转换为字符串而不是将我的json字符串传递给数组。我通过检查之前和之后的typeof进行了测试。我理解为什么不能使用push因为它不再是一个数组。但我不知道解决方案。

代码

// array to store notes in
var notes = [];

// note JSON object
var note = {
    title: title,
    body: body
};

try {
    // read pre-existing content of notes-data.json file
    var notesString = fs.readFileSync('notes-data.json');

    // store pre-existing data as the notes array, passing as 
    // JSON
    console.log("notesString: " + typeof notesString)
    console.log("notes before parse: " + typeof notes)

    notes = JSON.parse(notesString)

    console.log("notes after parse:" + typeof notes)
} catch (e) {

}

// add note to notes array
notes.push(note)

// store content of notes array in notes-data.json as a string 
fs.writeFileSync('notes-data.json', JSON.stringify(notes));

这是我的JSON

"[{\"title\":\"herp\",\"body\":\"derp\"},{\"title\":\"herp\"‌​‌​,\"body\":\"derp\"‌​}]‌​"

输出

notesString: object
notes before parse: object
notes after parse:string
C:\Visual Studio 2015\Projects\Note_App_NodeJS\Note_App_NodeJS\notes.js:32
    notes.push(note)
          ^

TypeError: notes.push is not a function

解决 对不起的人我不知道发生了什么,但我应该先验证我的输出/输入。我不知道为什么它以这种方式格式化,并且它以正确的json格式格式化,因为转换为stingify然后解析回来。我正在使用带有Nodejs扩展的Visual Studio,所以可能与它有关。

2 个答案:

答案 0 :(得分:4)

由于外部引号,它是一个字符串。如果删除它们,则JSON无效。您必须根据JSON规则对其进行格式化。所有键必须是字符串,值只能是基元,如字符串,数字,布尔值,数组或其他JSON对象。

将您的JSON格式化为

[
    {
        "title": "herp",
        "body":"derp"
    },
    {
        "title":"herp"‌​‌​,
        "body":"derp"‌
    ​}
]‌​

您可以在此处看到一些示例:http://json.org/example.html

答案 1 :(得分:2)

  抱歉,我应该更加具体地说明它包含的内容

"[{\"title\":\"herp\",\"body\":\"derp\"},{\"title\":\"herp\"‌​,\"body\":\"derp\"}]‌​"

这是字符串的JSON表达式,这就是解析它时得到字符串的原因。

该字符串碰巧包含一组嵌套的JSON,它是您要查找的数组。

从字符串中提取该数组并将其放入文件中。

[{"title":"herp","body":"derp"},{"title":"herp"‌​,"body":"derp"}]‌​