将无效的JSON字符串转换为JSON

6

我有一个无效的JSON字符串,如下所示:

"{one: 'one', two: 'two'}"

我试过使用JSON.parse将其转换为对象,但这不是有效的JSON字符串。 是否有任何函数可以将此无效格式转换为有效的JSON字符串或直接转换为对象?


2
首先,为什么不一开始就使用有效的JSON字符串呢?此外,您可能会发现JSONLint在验证JSON字符串方面非常有帮助。 - JW Lim
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval - Dr.Molle
1
想象一种边缘情况,你正在接受无效的用户输入。这是一个合理的问题。 - lfender6445
2个回答

6

如果您的示例语法与实际JSON相同,则JSONLint表示您需要为名称和值使用双引号。

仅在这种情况下,使用以下替换调用:

var jsontemp = yourjson.replace((/([\w]+)(:)/g), "\"$1\"$2");
var correctjson = jsontemp.replace((/'/g), "\"");
//yourjson = "{one: 'one', two: 'two'}"
//jsontemp = "{"one": 'one', "two": 'two'}"
//correctjson = "{"one": "one", "two": "two"}"

然而,你应该尝试首先使用有效的Json。


请注意,这个正则表达式也会将像"{one: 'one tree:', two: 'two'}"这样的字符串转换为"{"one": "one "tree":", "two": "two"}"(它将匹配任何跟在“:”后面的单词,即使它是值的一部分而不是键),但我认为在这种情况下使用正则表达式替换字符串是最好的方法。正如@Crow EH所说,无风险/理想的方式是首先拥有一个有效的JSON字符串。 - Aylen
它也会遇到包含空格或标点符号的键的问题,而包含冒号的键将是更进一步的复杂化。仅使用正则表达式处理这些情况将很困难,特别是如果嵌套对象是可能的话;您可能需要一个更复杂的算法,将正则表达式与split()结合起来。不知道问题JSON来自何处以及可能包含什么内容,很难说。 - bobtato

1
如果问题是“我能将无效的JSON转换为有效的JSON吗?”,一般情况下答案显然是“不行”;像"$@!~~"这样的字符串,你从哪里开始呢?
在这种特殊情况下,JSON仅因属性名称未被引用而无效;作为JavaScript,该字符串是有效的,可以使用例如解析。
var myObj = eval( "x=" + myString );

或者更好。
var myObj = (new Function("return " + myString))();

然而,这样做可能非常不安全,除非你确定字符串不会造成伤害(如果你不能首先生成有效的 JSON,这似乎是不太可能的)。此外,如果 JSON 代码以其他方式无效,这也不会帮助你,如果属性名称不是有效的 JS 标识符,它也会失败。
要得到一个正确的答案,了解更多有关问题的上下文可能会有用。

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