无法使用jQuery解析此JSON

时间:2013-03-15 14:49:15

标签: jquery json jquery-1.9

我正在获取一些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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

这意味着您的Date对象需要是一个字符串,您的属性名称必须是双引号。

http://jsonlint.com/这样的工具通常非常有用。

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

答案 2 :(得分:1)

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

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

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

请注意,max密钥成为字符串"max"Date已转换为时间戳。

答案 3 :(得分:0)

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

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

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