我尝试使用 .json 文件导入本地 .json 文件d3.json()
。
该文件filename.json
与我的 html 文件存储在同一文件夹中。
然而 (json) 参数为空。
d3.json("filename.json", function(json) {
root = json;
root.x0 = h / 2;
root.y0 = 0;});
. . .
}
我的代码与此d3.js 示例中的代码基本相同
我尝试使用 .json 文件导入本地 .json 文件d3.json()
。
该文件filename.json
与我的 html 文件存储在同一文件夹中。
然而 (json) 参数为空。
d3.json("filename.json", function(json) {
root = json;
root.x0 = h / 2;
root.y0 = 0;});
. . .
}
我的代码与此d3.js 示例中的代码基本相同
如果您在浏览器中运行,则无法加载本地文件。
但是在命令行上运行开发服务器相当容易,只需cd
进入包含文件的目录,然后:
python -m SimpleHTTPServer
(或python -m http.server
使用python 3)
现在在您的浏览器中,转到localhost:3000
(或:8000
命令行上显示的任何内容)。
以下曾经在旧版本的 d3 中工作:
var json = {"my": "json"};
d3.json(json, function(json) {
root = json;
root.x0 = h / 2;
root.y0 = 0;
});
在 d3.v5 版本中,您应该这样做
d3.json("file.json").then(function(data){ console.log(data)});
同样,对于 csv 和其他文件格式。
添加到前面的答案中,使用大多数 Linux/Mac 机器提供的 HTTP 服务器更简单(只需安装 python)。
在项目的根目录中运行以下命令
python -m SimpleHTTPServer
然后,不要访问file://.....index.html
打开浏览器http://localhost:8080
或运行服务器提供的端口。这种方式将使浏览器获取项目中的所有文件而不会被阻止。
http://bl.ocks.org/eyaler/10586116 参考这段代码,这是从文件中读取并创建图表。我也有同样的问题,但后来我发现问题出在我正在使用的 json 文件中(一个额外的逗号)。如果你在这里得到 null 尝试打印你得到的错误,就像这样。
d3.json("filename.json", function(error, graph) {
alert(error)
})
这在 Firefox 中工作,在 chrome 中它不打印错误。
使用 (d3)js 加载本地 csv 或 json 文件并不安全。他们阻止你这样做。有一些解决方案可以让它工作。以下行基本上不起作用(csv 或 json),因为它是本地导入:
d3.csv("path_to_your_csv", function(data) {console.log(data) });
解决方案 1: 禁用浏览器中的安全性
不同的浏览器具有不同的安全设置,您可以禁用这些设置。此解决方案可以工作,您可以加载文件。然而,禁用是不可取的。它会让你容易受到各种线程的攻击。另一方面,如果您告诉他们手动禁用安全性,谁会使用您的软件?
禁用 Chrome 中的安全性:
--disable-web-security
--allow-file-access-from-files
解决方案 2: 从网站加载 csv/json 文件。
这似乎是一个奇怪的解决方案,但它会起作用。这是一个简单的解决方法,但可能不切实际。有关示例,请参见此处。查看页面源代码。这是这样的想法:
d3.csv("https://path_to_your_csv", function(data) {console.log(data) });
解决方案 3: 启动您自己的浏览器,例如 Python。
这样的浏览器不包括所有类型的安全检查。当您在自己的机器上试验代码时,这可能是一个解决方案。在许多情况下,当您拥有用户时,这可能不是解决方案。此示例将在端口 8888 上提供 HTTP,除非它已被占用:
python -m http.server 8888
python -m SimpleHTTPServer 8888 &
打开(Chrome)浏览器地址栏并在下面输入。这将打开 index.html。如果您有不同的名称,请输入该本地 HTML 页面的路径。
localhost:8888
解决方案 4: 使用本地主机和 CORS
您可以使用本地主机和 CORS,但这种方法对用户不友好,因为设置它可能不是那么简单。
解决方案 5: 将数据嵌入 HTML 文件中
我最喜欢这个解决方案。您可以编写一个将数据直接嵌入到 html 中的脚本,而不是加载您的 csv。这将允许用户使用他们喜欢的浏览器,并且不存在安全问题。这个解决方案可能不是那么优雅,因为您的 html 文件可能会根据您的数据而增长得非常困难,但它会起作用。有关示例,请参见此处。查看页面源代码。
删除这一行:
d3.csv("path_to_your_csv", function(data) { })
替换为:
var data =
[
$DATA_COMES_HERE$
]
您无法轻松读取本地文件,至少在 Chrome 中不是,在其他浏览器中也可能不是。
最简单的解决方法是简单地将您的 JSON 数据包含在您的脚本文件中,然后简单地摆脱您的d3.json
调用并将代码保留在您传递给它的回调中。
您的代码将如下所示:
json = { ... };
root = json;
root.x0 = h / 2;
root.y0 = 0;
...
我用过这个
d3.json("graph.json", function(error, xyz) {
if (error) throw error;
// the rest of my d3 graph code here
}
因此您可以使用变量 xyz 来引用您的 json 文件,而 graph 是我本地 json 文件的名称
使用资源作为局部变量
var filename = {x0:0,y0:0};
//you can change different name for the function than json
d3.json = (x,cb)=>cb.call(null,x);
d3.json(filename, function(json) {
root = json;
root.x0 = h / 2;
root.y0 = 0;});
//...
}