0

我正在获取一些 JSON 数据,其中包含单行的最简单示例是:

{ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] }

它似乎形成良好:

>>> console.log({ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] })
Object { max=[1]}

不过,如果我尝试:

>>> $.parseJSON("{ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] }");

SyntaxError: JSON.parse: expected property name or '}'

为什么是这样?

谢谢大家,我还没有意识到 JavaScript Object Notation 和 Strict JSON 之间的区别。我把它改成这样的输出:

{ "max": [[1353007547000,70.0000]] }

此数据的上下文是用于通过 ajax 加载一些 HighCharts 数据,但所有示例均采用上述格式,无 ajax。

4

4 回答 4

7

JSON 是一个严格的标准,它恰好是 Javascript 的一个子集。Date是它忽略的事情之一 - 如果你想要日期,你必须将它作为字符串(或 int)传输。您的代码是有效的 JavaScript,但不是有效的 JSON。

于 2013-03-15T14:50:36.843 回答
2

您仍在处理类似于 JSON而不是真正的 JSON的JavaScript 对象。对于 .parseJSON,您需要严格的 JSON。

这意味着您的 Date 对象需要是一个字符串,并且您的属性名称需要用双引号括起来。

http://jsonlint.com/之类的工具通常非常有用。

@c4p 建议首先在您的 JavaScript 对象上使用 JSON.stringify,这通常是一个很好的第一步,因为它通常会处理很多需要在解析之前进行调整的事情。

于 2013-03-15T15:04:18.253 回答
1

如果您将 Javascript 对象转储为 JSON:

JSON.stringify({ max: [[Date.UTC(2013,1,22,13,11,13), 999.0000]] });

"{"max":[[1361538673000,999]]}"

请注意,max键变成了字符串"max",并且Date被转换为时间戳。

于 2013-03-15T14:54:35.403 回答
0

Date 是一个 javascript 对象,不是 JSON 的一部分。您正在尝试通过序列化表单传递 javascript 函数调用,这将不起作用。

它在控制台日志中起作用的原因是 Date.UTC 函数在调用 console.log 之前解析为一个值。看起来这个字符串很可能最初是为了传递给可以执行函数的 eval(它执行文字 javascript)而设置的,而您正试图通过使用 parseJSON(这很好!)来降低它的脆弱性。

此处的解决方案取决于您对接收的 JSON 数据的控制程度。如果您的控制为零,那么您可能会被迫使用 eval。否则,json 应该包含传递给 UTC 的参数数组(或时间戳本身),当它被解析时,您需要在结果上调用 Date.UTC 以获取您的 UTC 日期。

于 2013-03-15T14:55:56.727 回答