【问题标题】:convert invalid JSON string to JSON将无效的 JSON 字符串转换为 JSON
【发布时间】:2023-03-22 09:38:01
【问题描述】:

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

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

我尝试使用 JSON.parse 将其转换为对象。但是,这不是有效的 json 字符串。 有没有什么函数可以把这种无效格式转换成有效的json字符串或者直接转换成对象?

【问题讨论】:

标签: javascript json jsonobject stringify


【解决方案1】:

如果问题是“我可以将无效的 JSON 转换为有效的 JSON”,那么在一般情况下,答案显然是“否”;您甚至会从哪里开始使用像“$@!~~”这样的字符串?

在这种特殊情况下,JSON 是无效的,因为属性名称没有被引用;作为 JavaScript,字符串 有效的,可以使用例如

来解析
var myObj = eval( "x=" + myString );

或更好

var myObj = (new Function("return " + myString))();

但是,这可能非常不安全,除非您确定字符串不会造成伤害(如果您无法在第一名)。如果 JSON 代码在其他方面无效,它也无济于事,如果属性名称不是有效的 JS 标识符,它也会失败。

要获得正确的答案,了解更多有关此问题的上下文会很有用。

【讨论】:

    【解决方案2】:

    如果您的示例语法与您的真实 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。

    【讨论】:

    • @eded 考虑到这个正则表达式也会将"{one: 'one tree:', two: 'two'}"之类的字符串转换为"{"one": "one "tree":", "two": "two"}"(它会匹配任何后跟“:”的单词,即使它是值的一部分,不是关键),但我认为在这种情况下使用正则表达式替换字符串是最好的方法。正如@Crow EH 所说,无风险/理想的方法是首先拥有一个有效的 JSON 字符串。
    • 包含空格或标点符号的键也会有问题,而包含冒号的键会更加复杂。仅使用正则表达式很难处理这些情况,尤其是在可能存在嵌套对象的情况下;您可能需要一个更复杂的算法,将正则表达式与 split() 结合起来。如果不知道更多关于 JSON 的问题来自何处以及它可能包含的内容,很难说。
    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2021-09-23
    相关资源
    最近更新 更多