javascript - Node 从url中获取json

标签 javascript node.js json fetch-api

我正在尝试在 Nodejs 中获取和解析下面返回的 JSON。问题似乎是 Node 代码试图解析包含换行符的 JSON 字符串,但我不确定如何避免这种情况,以及为什么 fetch 在 chrome devtools 中有效。我猜问题是我对 https 请求的简单了解,所以如果有人能解释出了什么问题,我将不胜感激。

const url = "https://beta.charitycommission.gov.uk/umbraco/api/charityApi/getSearchResults?searchText=&pageNumber=1&contextId=1126&onlyShow=&&&&&&&"

我可以在域上打开的 chrome devtools 中成功运行它。此外,JSON 似乎会自动解析为一个对象,这是我没想到的。

fetch(url).then(res => res.json()).then(json => console.log(json.pageItems))

我已经在 node 中尝试了以下方法,但都没有用。

const fetch = require("node-fetch");
await fetch(url).then(res => res.json()); // Unexpected token  in JSON at position 0

const rp = require('request-promise-native');
const json = await rp({uri: url}) // returns JSON string with newline characters
JSON.parse(json) // Unexpected token  in JSON at position 0

最佳答案

问题是您的 JSON 文件是以 UTF-8 BOM 格式保存的。

这是什么意思?

您的文件以所谓的字节顺序标记字符开始,U+FEFF (Zero Width No-break Space) .

那是不可见的(宽度为零),但仍然存在,JSON 解释器无法解析它。

如何解决?

  1. 保存没有BOM的JSON数据,或者
  2. 使用 res.text() 然后使用 JSON.parse(text.slice(1)) 删除前导字符:

    fetch(url)
    .then(res => res.text())
    .then(text => JSON.parse(text.slice(1)))
    .then(json => console.log(json.pageItems))
    

为什么它在 Chrome 中有效?

Chrome 会自动从任何获取/下载的文件中删除 BOM 字符,以避免类似问题。

关于javascript - Node 从url中获取json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58774360/

相关文章:

node.js - 有人可以提供一个我需要使用 socket.io-redis 的示例情况吗?

javascript - graphql查询转json查询

json - 多语言 Jade 模板?

ios - 图像不会发送到我的 Alamofire .post 请求中的后端 - Swift 3

javascript - 复制文本框的按钮

javascript - AngularJS 在没有指示的情况下更新不同文件中的变量

node.js - 在 node.js 中使用 "natural"模块

javascript - jQuery:如何将选择保存在 cookie 中?

javascript - PHP - 未检测到 isset($_POST ['rejectSeed' ])

javascript - 计划执行中的node.js字符串常量