javascript - d3.json 无法解析 'Infinity' 值

标签 javascript json d3.js

我正在尝试读取 sqlite 数据库数据并将其作为 json 数据提供给 d3 以构建图形。我可以轻松读取 json 格式的数据,例如这个 URL

http://localhost:8085/SQLQuery/?date1=2019-03-01%2000:00:00&date2=2019-03-31%2023:59:59&radio=0013a200410a4bc1

返回此数据:

[
   ["2019-03-13 08:59:42.445199", 20.0, -93150.3125, -1128635.625],
   ["2019-03-13 09:00:18.670074", 21.0, -116238.2734375, -Infinity],
   ["2019-03-13 09:00:54.897829", 21.0, -111895.09375, -1916368.5],
   ["2019-03-13 09:01:31.063545", 21.0, -116290.6484375, -1332886.0],
   ["2019-03-13 09:02:07.244134", 21.0, -99264.3828125, -Infinity],
   ["2019-03-13 09:02:43.424961", 21.0, -109359.6953125, -1090349.25],
   ["2019-03-13 09:03:19.621574", 21.0, -114976.4375, -3437984.0],
   ["2019-03-13 09:03:55.800267", 21.0, -97664.5078125, -1667308.5],
   ["2019-03-13 09:04:31.995798", 21.0, -102451.046875, -Infinity],
   ["2019-03-13 09:05:08.172229", 21.0, -109326.34375, -3360548.75],
   ["2019-03-13 09:05:44.367397", 21.0, -110630.9140625, -732758.8125],
   ["2019-03-13 09:06:20.576101", 21.0, -110025.140625, -926976.3125],
   ["2019-03-13 09:06:56.771144", 21.0, -116129.8984375, -Infinity]
]

现在,当使用 d3.json 函数读取相同的数据时,我遇到了“无限”值的问题:

jsondata = d3.json("http://localhost:8085/SQLQuery/?date1=" + date1 + "&date2=" + date2 + "&radio=" + wradio);

给出错误:

语法错误:JSON.parse:JSON 数据的第 1 行第 122 列出现意外的非数字

Column 122 corresponds to first 'Infinity' value in json data.

有没有允许解析“无限”值的选项?我是否需要确保这些值永远不会到达数据库并转换为有效数字?

最佳答案

根据 this answer (虽然你的问题不是重复的)你最好的选择是生成正确的 JSON,你可以将其传递给 d3.json

但是,如果这不是一个选项,您可以使用 d3.text 来获取无效的 JSON,如下所示(假设您使用的是 D3 v5):

d3.text("data.json").then(function(textData){
    //...
};

然后,在 d3.text(或 v5 中的 then 方法)中,您可以将 -Infinity 替换为相应的字符串, 在使用 JSON.parse() 之前:

textData = textData.replace(/-Infinity/g, '"-Infinity"');
const data = JSON.parse(textData);

此外,按照同一链接答案中的建议,您可以恢复原始 -Infinity,通过使用 JSON.parse() 中的 reviver 函数替换字符串>:

textData = textData.replace(/-Infinity/g, '"-Infinity"');
const data = JSON.parse(textData, function(key, value){
    return value === "-Infinity" ? -Infinity : value;
});

因为我不能在堆栈片段中使用真正的 JSON,这里是一个 blockbuilder,使用像你这样的 JSON:

[
    ["2019-03-13 08:59:42.445199", 20.0, -93150.3125, -1128635.625],
    ["2019-03-13 09:00:18.670074", 21.0, -116238.2734375, -Infinity],
    ["2019-03-13 09:00:54.897829", 21.0, -111895.09375, -1916368.5]
]

查看控制台:https://blockbuilder.org/GerardoFurtado/e853f11e0604a929f82fcd62a33f925e

关于javascript - d3.json 无法解析 'Infinity' 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55138143/

相关文章:

javascript - Ajax !需要一个小修复

json - Azure RM 模板。如何使用 VS 自动上传资源而不是从 GitHub 获取资源

javascript - 使用d3js在半圆圆环图中从右到左绘制进度路径

javascript - 无需手动遍历每个对象即可将属性添加到大量对象

javascript - 如何根据我创建和填写的容器的 ID 生成 JSON 对象

javascript - D3,js图表仪表板转换为png/jpg/pdf

javascript - d3py 示例代码中出现 IO 错误 - 没有这样的文件或目录 : 'static/d3.js'

javascript - 当 JavaScript 代码中包含 HTML 标签时,如何让 JSHint 发出警告?

javascript - 使用 React 单击按钮时在 div 上显示返回的对象

javascript - 在从 Phonegap 相机捕获的图像上绘制文本(自定义文本)