使用jQuery解析没有引号的JSON数据

4

我正在尝试通过jQuery解析通过AJAX从远程服务器获取的JSON数据。JSON数据如下:{identifier:"ID", label:"LABEL"},但无法解析。显然,标识符和标签字段没有双引号。在我的本地测试网站上使用双引号进行测试时可以正常工作。

是否可以在不使用引号的情况下通过jQuery使其正常工作?我已经搜索了很多,但没有找到解决方案。

感谢您的任何输入。


我猜你对远程服务器没有控制权?即使你无法控制该服务器(给他们发电子邮件?),传递错误的JSON也是他们应该解决的问题。你能否提供一个错误的JSON示例?如果您绝对无法更改API,则可能有正则表达式修复或一些快速而肮脏的方法。 - brandwaffle
你必须在客户端上做这件事吗?Jackson可以为您读取这样格式不正确的JSON,但它是Java和服务器端。 - fge
5
也许你已经从之前的评论中得出结论,但开发人员喜欢使用晦涩难懂的语言,所以这里明确指出:这不是有效的JSON格式。创建一个读取无效JSON的hack并不是一个好的方法。你应该一开始就获得有效的JSON数据。 - Greg Pettit
@GregPettit 好的,但你并不能总是说服别人立即或根本不改变他们的API(使用该API的其他人可能依赖于这种格式错误的输出)。 OP可能已经意识到这一点,并且别无选择。好的方法!=唯一的方法,不幸的是。 - brandwaffle
@brandwaffle 你说得对,不幸的是我无法控制数据。感谢所有的输入。现在确认是坏数据。我想我需要一个解决办法来修复这个坏数据。 - BARON'S
显示剩余3条评论
3个回答

9

是的,它不是有效的JSON格式,但是谁在乎它是否有效。

至少我不在乎,我只想解析它,所以我写了jsonlite。

使用Jsonlite,你可以这样做:

var s = '{name: jsonlite, birthday: {year: 2013, month: 7, day: 7}, isGreat: true}';
var obj = jsonlite.parse(s);

这将产生与下面代码完全相同的结果:

var s = '{"name": "jsonlite", "birthday": {"year": 2013, "month": 7, "day": 7}, "isGreat": true}';
var obj = $.parseJSON(s);

不错啊 :) +10 给 'blahblahblah' :D - sulest

4
您无法这样做。 JSON规范如下所述:

您无法这样做。JSON规范如下:

A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string. A string is very much like a C or Java string.

将字符串视为你提到的标签。

来源: http://www.json.org/


0

通过使用正则表达式,可以将无效的JSON转换为有效的JSON。 在下面的示例中,sFixed将是有效的JSON,可以解析:

let s = '{identifier:"ID", label:"LABEL"}',
    sFixed = s.replace(/(['"])?([a-zA-Z0-9_][a-zA-Z0-9_\s]*[a-zA-Z0-9_])(['"])?:/g, '"$2": '), //'{"identifier":"ID", "label":"LABEL"}'
    obj = JSON.parse(sFixed);

1
单独的代码块并不能提供一个好的答案。请添加说明(为什么解决了这个问题,出现了什么错误等等...) - Louis Barranqueiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接