【问题标题】:NodeJs JSON parsing issueNodeJs JSON解析问题
【发布时间】:2018-09-18 03:12:00
【问题描述】:

我有一个 .json 文件,其中存储了人们的姓名。我正在使用节点管理器中的文件系统从该文件中读取内容,然后尝试将此 json 转换为字符串并将其解析为 JS 对象。将其解析为 JS 对象后,我得到类型字符串而不是对象。 这是示例 json 文件:

{
"21154535154122752": {
    "username": "Stanislav",
    "discriminator": "0001",
    "id": "21154535154122752",
    "avatar": "043bc3d9f7c2655ea2e3bf029b19fa5f",
    "shared_servers": [
        "Reactiflux",
        "Discord Testers",
        "Official Fortnite",
        "Discord API"
    ]
    }
}

这是处理数据的代码:

const string_data = JSON.stringify(fs.readFileSync('data/users.json', 'utf8'));
const data = JSON.parse(string_data);
console.log(typeof(data)); // <-- this line here shows the type of data as string
const results_array   = Object.values(data);

其中 fs 是来自 npm 的文件系统包。

【问题讨论】:

标签: javascript json node.js npm


【解决方案1】:

不要使用JSON.stringify,因为它会进一步改变 JSON 对象的字符串表示。下面是正在发生的事情的一个示例

想象一下,如果您的文件中有如下所示的数据

{
   "key": "value"
}

当您读取文件(使用readFileSync)并应用JSON.stringify 时,它会转换为如下所示的新字符串。你可以注意到双引号现在被转义了

"{\"key\": \"value\"}"

现在,当您使用 JSON.parse 解析它时,您将获得从文件中读取的相同字符串,而不是获得所需的 object

你基本上是先执行然后撤消字符串化操作

【讨论】:

  • 我现在明白了,但是当我使用其他方式时,我得到了这个错误:undefined: 1 '{' SyntaxError: Unexpected token in JSON at position 0
  • 您能否使用console.info 打印您从readFileSync 收到的字符串并检查是否正确?
  • 是的,一切看起来都很好。但无法摆脱这个错误。
  • 当我在控制台中打印字符串时,我没有收到末尾的引号是我应该担心@S4beR 的事情吗?
  • 我假设您看到类似 {"key": "value"} 的内容?这个表示很好
【解决方案2】:

这对我有用:

const data = JSON.parse(fs.readFileSync('data/users.json', 'utf8'));
console.log(typeof(data)); // <-- this line here shows the type of data as OBJECT
const results_array   = Object.values(data);

【讨论】:

  • 我真的不知道自己做错了什么,也许是构造不好的json。
【解决方案3】:

好的,所以 fs.readFileSync 返回一个字符串,所以你不需要使用 stringify

var fs = require('fs');
var read = fs.readFileSync('data/users.json', 'utf8');
console.log(read);
console.log(typeof(read));
const data = JSON.parse(read);
console.log(typeof(data));

你会看到它返回一个对象

【讨论】:

  • 我不知道,但我收到错误 undefined: 1 '{' SyntaxError: Unexpected token in JSON at position 0
  • 只是为了确保你有一个名为 data 的文件夹,里面有 users.json 对吗?
  • 它仍然存在同样的问题@AmirHosseinRd
猜你喜欢
  • 2019-10-28
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多