节点从url获取json

问题描述 投票:1回答:2

我正在尝试在Nodejs中获取并解析下面返回的JSON。看来问题在于节点代码正在尝试解析包含换行符的JSON字符串,但我不确定如何避免这种情况,以及为什么提取在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))

我在节点中尝试了以下操作,但没有用。

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
javascript node.js json fetch-api
2个回答
3
投票
问题是您的JSON文件以UTF-8 BOM格式保存。

这是什么意思?

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

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

如何解决?

保存不带BOM的JSON数据,或

  1. 使用U+FEFF,然后用res.text()删除前导字符:

  • JSON.parse(text.slice(1))
  • 为什么在Chrome中可以使用?

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


    0
    投票
    fetch

    const json = await fetch(url).then(res => res.json()) 解析JSON数据并返回一个对象。使用res.json()将数据返回到变量await

    © www.soinside.com 2019 - 2024. All rights reserved.