2013-03-15 54 views
0

我得到了一些JSON数据,最简单的例子,其中单持有行:无法解析此JSON与jQuery

{ 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,但所有的例子是在上述格式SANS AJAX。

+1

呃...你的JSON无效。*“它看起来很好”*:在这种情况下,您将它解释为JavaScript,它是一个有效的对象字面值,但这与JSON不同。 – 2013-03-15 14:50:24

+4

这是无效的 - 首先检查http://jsonlint.com/ – Terry 2013-03-15 14:50:48

回答

2

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

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

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

@ C4P表明你的JavaScript对象上透过JSON.stringify第一,那就是经常因为它会经常处理大量的问题需要之前分析调整的东西是很好的第一步。

+0

*“类似JSON的JavaScript对象”*听起来真的很奇怪......对象字面符号和JSON除了那个之外没有什么共同之处受另一方的启发。我认为你的陈述使字面语法和JSON之间的区别更加混乱。 – 2013-03-15 15:40:13

+0

@FelixKling我同意这句话真的很奇怪。不过,我经常发现,当向更新的人们描述这种区别时,他们会考虑JSON和JavaScript对象之间的区别,因此首先要点头表示模糊的相似性。虽然这听起来可能很奇怪,因为我们已经理解了字面语法和符号之间的根本区别。也许最好说JavaScript对象通常看起来类似于JSON(JavaScript对象表示法),但是一旦你超越了它们的物理外观,这些相似之处就会结束。 – purgatory101 2013-03-15 16:20:13

7

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

1

如果你倾倒你的Javascript对象JSON:

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

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

通知之max键变成一个字符串"max"Date被转换为一个时间戳。

0

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

它在控制台日志中工作的原因是由于Date.UTC函数在调用console.log之前解析为值。它看起来像最有可能此字符串最初设置与被传递给eval的意图(其中执行字面的JavaScript),它可以执行的功能和您正试图使其不太使用parseJSON脆弱的(这是很好的!)。

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