如何在 D3 中正确加载本地 JSON?

Posted

技术标签:

【中文标题】如何在 D3 中正确加载本地 JSON?【英文标题】:How to properly load local JSON in D3? 【发布时间】:2019-03-02 20:08:20 【问题描述】:

尝试从 D3 中的同一文件夹加载本地 .json 文件(并将其记录到控制台),但控制台中有两个错误:

d3.v5.js:5908 Fetch API 无法加载 [buildings.json - 文件]。 URL 方案必须是 用于 CORS 请求的“http”或“https”。 json@d3.v5.js:5908(匿名)@ index.html:10

d3.v5.js:5908 Uncaught (in promise) TypeError: Failed to 拿来 在 Object.json (d3.v5.js:5908) 在 index.html:10 json@d3.v5.js:5908(匿名)@index.html:10 Promise.then(异步)(匿名)@index.html:10

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <script src="https://d3js.org/d3.v5.js"></script>
  </head>
  <body>
    <script>
d3.json("buildings.json").then(data => console.log(data))
    </script>
  </body>
</html>

有人知道原因并有解决办法吗?

【问题讨论】:

如果那是您的数据源,请不要使用 d3.json 来获取您的数据 【参考方案1】:

d3.json 使用fetch

export default function(input, init) 
  return fetch(input, init).then(responseJson);

https://github.com/d3/d3-fetch/blob/master/src/json.js

所以您正在处理这些 SO 帖子中描述的相同问题。

Importing local json file using d3.json does not work

"Cross origin requests are only supported for HTTP." error when loading a local file

Fetch API cannot load file:///C:/Users/woshi/Desktop/P5/p5/JSON/birds.json. URL scheme must be "http" or "https" for CORS request

您正面临跨源资源共享问题,这是您浏览器的一项安全功能。

两个选项二避免这种情况:

    使用网络服务器。要为您的静态 html/js 文件运行一个简单的网络服务器,可以使用类似 npm http-server (https://www.npmjs.com/package/http-server) 的东西

    更改您的 chrome 启动参数,并让它知道您要忽略此安全功能。您可以通过更改启动配置来做到这一点,例如这样

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="%LOCALAPPDATA%\Google\Chrome\User Data\发展”

参数 --disable-web-security --user-data-dir 是这里的重要部分。

注意:仅用于开发。您允许对您访问的所有网站进行跨源请求。

【讨论】:

【参考方案2】:

How to launch html using Chrome at "--allow-file-access-from-files" mode? 中提到的另一种可能性是使用像 Web Server for Chrome 这样的浏览器扩展

【讨论】:

以上是关于如何在 D3 中正确加载本地 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

如何保存在 d3.js 脚本中构建的 JSON 数据

如何确保 D3 在 javascript 运行之前完成加载多个 CSV?

转换 d3 图表以从变量内的 json 加载数据

如何进行 d3.js 轴的本地化?

如何将 json 文件加载到本地存储中?

使用 D3.js 加载本地数据以进行可视化