JSON 中的键缺少引号

问题描述 投票:0回答:3

我有一个包含格式错误的 JSON 的字符串,该字符串提供给我,其中键缺少引号。 JSON 的结构超出了我的控制范围,因此我需要使用现有的结构。 我找到了 OP 在 Parsing malformed JSON in JavaScript 中发布的解决方案,但是其中一个值包含正则表达式匹配的 URL,并将其转换为另一个类似值的键,导致真正损坏的 JSON。有什么想法吗?

我也看过jsonrepair,但没有取得太大成功。

javascript regex json node.js
3个回答
9
投票

如果 JSON 唯一的问题是不带引号的属性名称,那么它仍然是有效的 JavaScript 对象文字,即使它不是有效的 JSON。

因此,如果您信任来源,您可以将文本括在括号中并

eval

这将比任何正则表达式更简单、更可靠。

示例:

var badJSON = '{ a: "b" }';
var obj = eval( '(' + badJSON + ')' );
console.log( obj );    // Logs: Object {a: "b"}
console.log( obj.a );  // Logs: b

6
投票

这应该可以。您需要做的就是识别冒号后面是否跟着正斜杠(如 http://),而不是单独识别。请注意,如果您的 JSON 值之一包含冒号,这将会失败,因此您的用例可能需要更多改进。

.replace(/(['"])?([a-zA-Z0-9_]+)(['"])?:([^\/])/g, '"$2":$4');

0
投票

如果您不希望它修改对象的字符串,那么您可以使用这个,它在开头和结尾有额外的正则表达式,以确保属性键所在的对象周围没有引号。注意:如果字符串很长,这在某些 JavaScript 引擎上可能会非常慢。

.replaceAll(/(?<!(?<!^([^"]*["][^"]*)+)(([^"]*(?<!([^\\])(\\\\)*?\\)"){2})*([^"]*(?<!([^\\])(\\\\)*?\\)")[^"]*)(?<prefix>[\{\,])[\s\n]*(?<identifier>[\-\_a-zA-Z0-9\.\+]*)[\s\n]*\:[\s\n]*(?!([^"]*(?<!([^\\])(\\\\)*?\\)")[^"]*(([^"]*(?<!([^\\])(\\\\)*?\\)"){2})*(?!([^"]*["][^"]*)+$))/g, "$<prefix>\"$<identifier>\":")
© www.soinside.com 2019 - 2024. All rights reserved.