如何在 JQuery/Javascript 中处理来自服务器(源)的无效 JSON

Posted

技术标签:

【中文标题】如何在 JQuery/Javascript 中处理来自服务器(源)的无效 JSON【英文标题】:How to handle invalid JSON coming from the server(the source) in JQuery/Javascript 【发布时间】:2018-12-08 15:08:21 【问题描述】:

在我的应用程序中,我必须进行一个 Web 服务调用,它以 JSON 形式返回一个对象数组,我需要通过它动态地迭代和构造我的 UI(针对数组中的每个对象)。

问题是,对于某些请求,我得到无效/错误的 JSON,因此 jquery.parse() 简单地失败并且代码崩溃。不过我事先不知道,对于哪个请求,我会得到一个无效的 JSON!

有什么方法可以避免应用程序由于 JSON 错误而崩溃?我知道一种方法是在源本身更改 JSON 或在 JS 中使用 try-catch。但是,有什么方法可以处理糟糕的 JSON 场景并从中构造一个有效的场景。像任何可用的库或任何将可能的错误 JSON 转换为有效 JSON 的算法一样?

这样一个糟糕的 JSON 是:

"key1":"http://someUrl.com/somePath/path2/catalog.do?someVal\u003dsearch\u0026q\u003d""foo+bar"","key2":""...

在上面的场景中,foo+ bar 前后的 2 个连续双引号引起了这里的问题。它应该有点像这样:

"key1":"http://someUrl.com/somePath/path2/catalog.do?someVal\u003dsearch\u0026q\u003d","foo+bar:"","key2":""...

(在 foo+bar 之前添加了一个逗号,在 foo+bar 之后添加了一个冒号:在 foo+bar 之后)。但是我猜可能还有其他导致错误 JSON 的原因。

我在 UI 中使用 JS 和 JQuery(v 1.10.x)。

谢谢

【问题讨论】:

您可以发布无效 JSON 的示例吗? 您是否可以控制服务的服务器端代码以及它是用哪种语言编写的?例如,在使用json_encode 导出服务器端 php 并在 javascript 中解码(针对 unicode 字符 IIRC)时,我已经注意到小的有效性问题 不要试图“修复”损坏的数据客户端,这是导致头痛和错误的主要方法,因为它模糊了正确数据和错误数据之间的界限。服务应该是单点事实,并返回正确的数据或错误。 (400 错误请求,如果响应无效) @surya 如果有人认为他们正在生成 JSON,那么他们完全不知道自己在做什么,也没有为您和其他人创建 API 的业务。有人试图推出他们自己的 JSON 序列化程序,这是愚蠢的,应该不惜一切代价避免。去找这个其他团队,其他公司,不管它是什么,告诉他们他们错了,他们需要修复它。这不是您可以解决的问题,并且根本无法期望工作。而且,别忘了,你很可能最终要为这个问题负责。如果不能解决,我会认真考虑换一份新工作。 @surya 另外,jQuery 1.10.0 很古老。如果有特殊原因需要 1.x.x 分支,至少升级到 1.12.4,这是它的最后一个版本。 【参考方案1】:

这不会赢得任何美丽的奖项,但它应该可以完成工作:

const reg = /"\w+"\s*:\s*"([\w\s\.\$\/\\\?\+"\=\&]*)",/;
const result = `"key1":"someVal.com/Path1/Path2?route\u003dsearch\u0026q\u003d""foo+bar"", "key2":"..."`;
let match;
while (match = reg.exec(result)) 
  result = result.replace(match[1], match[1].replace(/"/g, `'`));

console.log(JSON.parse('' + result + '');

【讨论】:

以上是关于如何在 JQuery/Javascript 中处理来自服务器(源)的无效 JSON的主要内容,如果未能解决你的问题,请参考以下文章

jQuery javascript 数组处理

在 jquery/javascript 处理后移动到命名锚点

PHP/jQuery/JavaScript 中的免费 OCR 处理 API [关闭]

如何在 jQuery / javascript 中使用 each() 进行迭代或循环

WordPress 插件开发 - 如何使用 JQuery / JavaScript?

如何在 jQuery/javascript 中获取文本本身顶部的位置,而不是文本元素