0

我正在从事一个项目,该项目涉及以 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 的形式出现。

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

4

4 回答 4

2

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

json.org在此处输入图像描述

你可以做的是:

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

就个人而言,在这种情况下,我使用NaN(这是在数字数组中指出缺失数字的行业标准)结合eval(像 gson 这样的一些库允许在 JSON 中编写 NaN,因为它的缺失显然是不幸的)。

于 2013-04-30T13:55:05.670 回答
2

jQuery 尝试检测响应的响应格式并尝试为您验证它。因此,如果它检测到它是 JSON(通过 的Content-Type标头application/json,或者通过您将dataType选项设置为json),它将引发解析错误并拒绝它。

您可以将 jQuery 排除在外,并通过将;设置dataType为自己来处理解析。text

jQuery.ajax('/foo.html', {
    dataType: 'text'
}).done(jQuery.noop);

...然后在您的响应处理程序中,对字符串执行替换操作以将无效的 JSON 转换为有效的 JSON,然后使用jQuery.parseJSON;解析它

jQuery.ajax('/foo.html', {
    dataType: 'text'
}).done(function (data) {
    var formatted = data.replace(/,\s+,/g, ',null,');
    var parsed;

    try {
        parsed = jQuery.parseJSON(formatted);
    } catch (e) {
        // Handle errors;
        return;
    }

    // use parsed
});

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

于 2013-04-30T14:00:15.827 回答
0

不,这是一个糟糕的建议。建议回用 gzip 或其他压缩机制而不是破坏格式。这可能会导致其他人更想打破这种格式。那时它不是 JSON,而是您自己的格式。

如果必须,请发送一个您可以检测到的无意义值,例如 -1 或 "" 而不是空数组槽。这些将稍微缩小文件并且仍然有效。

于 2013-04-30T14:06:03.653 回答
0

如果它始终只是一个带有逗号的行,那么你可以做一些类似正则表达式替换的\b,\b事情(或者更聪明的事情,因为这有一些陷阱)0,在有“空”无效行的地方插入 0,然后解析最终结果。缩进无关紧要,所以应该可以。

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

于 2013-04-30T13:55:51.940 回答