使用无效的JSON

时间:2013-04-30 13:52:37

标签: jquery ajax json parsing validation

我正在开发一个涉及从JSON形式的服务器中获取大量数据点的项目。例如,响应可能包含长度为1000+的数组。

为了帮助压缩某些数据,建议忽略没有可用信息的可用数据中的漏洞。该项目涉及股票价格的变化,股票不一定每周交易7天。假期和周末目前只用逗号表示,如下:

...

"C001":[
           204.45,
           201.99,
           203.25,
           202.98,
           201.46,
,
,
           194.34,
           194.03,
           190.81,
           188.75,
           189.31,
,
,

....

等等。

  • 是否可以接受JSON数据,即使它无效?如果是这样,我可以搜索这些不存在的值并为它们提供一个空值来解释它们并使JSON有效吗?

谢谢!

编辑::可能相关的更多信息。

此数据可能会以JSONP的形式进入跨域。我们正在构建的内容实际上是一个可嵌入的小部件,用于访问我们客户的一些网页 - 数据以JSONP形式出现。

这可能有点幼稚(和初始-y) - 但是我可以将这个无效的JSON作为有效JSON字段的文本值传递,然后在客户端修复它/解析吗?

4 个答案:

答案 0 :(得分:2)

不,你不能只是传递JSON中的漏洞。数组不能有连续的逗号:

请参阅json.orgenter image description here

你能做的是:

  • 使用特定的预定义值(字符串,您可能无法正常接收的特殊号码)并在使用undefined解析后替换它
  • 使用eval代替JSON.parse(这只是一个有效的解决方案,因为您也是数据生产者)

就个人而言,在这种情况下,我使用NaN(这是数字数组中缺少数字的行业标准)与eval结合使用(像gson这样的库可以在JSON中编写NaN,因为缺席显然是不幸的。)

答案 1 :(得分:2)

jQuery尝试检测响应的响应格式,尝试为您验证响应格式。因此,如果它将其检测为JSON(通过Content-Type的{​​{1}}标头,或者通过将application/json选项设置为dataType),则会抛出一个解析错误拒绝它。

您可以将jQuery放在其中并通过将json设置为dataType来自行处理解析;

text

...然后在您的响应处理程序中,对字符串执行替换操作以将无效的JSON转换为有效的JSON,然后使用jQuery.ajax('/foo.html', { dataType: 'text' }).done(jQuery.noop); 解析它;

jQuery.parseJSON

如果您控制发件人,您还可以查看hpack等解决方案。

答案 2 :(得分:0)

如果它总是只是一个带逗号的行,那么你可以做一些像\b,\b的正则表达式替换(或者更聪明的东西,因为这有一些陷阱),并插入0, 0表示存在“空”无效行,然后解析最终结果。缩进并不重要,因此应该正常工作。

如果传入的数据以一致的方式被破坏,那么在将其解析为标准JSON之前简单地尝试“修复”它本身就没有任何错误。

答案 3 :(得分:0)

没有。这是一个糟糕的建议。建议回使用gzip或其他压缩机制而不是破坏格式。这可能导致其他人想要更多地打破格式。那时它不是JSON而是你自己的格式。

如果必须,发送一个可以检测的无意义值,例如-1或“”而不是空数组槽。这些会缩小文件,但仍然有效。