我正在获取一些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。
答案 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日期。