gson 格式错误的JSON异常:无效的逸出序列

tsm1rwdh  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(238)

我有一个json字符串如下图:

{"person":[{"initials":"C. P.","familyName":"Mangum"}],"title":"Blood and tissue oxygen carriers","text":"(ed). \992d. Springer-Verlag, Heidelberg"}

反序列化上述json字符串时使用gson,如下所示:

gson.fromJson(json, MyObject.class)

我看到MalformedJsonException异常。

Caused by: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Invalid escape sequence at line 1 column 115 path $.test

然后,我尝试将JsonReader setLenient设置为true

JsonReader reader = new JsonReader(new StringReader(row));
reader.setLenient(true);
gson.fromJson(reader, MyObject.class);

但现在我得到ClassCastException

Caused by: java.lang.ClassCastException: class MyObject cannot be cast to class com.google.gson.JsonElement (MyObject and com.google.gson.JsonElement are in unnamed module of loader 'app')

后来,我尝试在GsonBuilder中使用setLenient(),但它失败了,出现了原始的MalformedJsonException异常

Gson gson = new GsonBuilder().setLenient().create();
gson.fromJson(row, MyObject.class);

我不确定我是否可以使用theString = theString.replace("\\", "\\\\");是安全的。有好的做法可以遵循吗?
我可以请知道我如何处理转义字符如上?

ha5z0ras

ha5z0ras1#

json的格式不正确,它应该以原始格式为\\992d提供双精度\:

{
    "person": [{
        "initials": "C. P.",
        "familyName": "Mangum"
    }],
    "title": "Blood and tissue oxygen carriers",
    "text": "(ed). \\992d. Springer-Verlag, Heidelberg"
}
ogq8wdun

ogq8wdun2#

你需要如下转义你的“text”元素,那么它将是一个有效的json。

{
    "person": [{
        "initials": "C. P.",
        "familyName": "Mangum"
    }],
    "title": "Blood and tissue oxygen carriers",
    "text": "(ed). \\992d. Springer-Verlag, Heidelberg"
}

Apache共享资源

如果您已经在使用Apache commons,它提供了一个静态方法:

StringEscapeUtils.escapeJson("some string")

它将任何字符串转换为正确转义的字符串,以便包含在JSON中。
https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/StringEscapeUtils.html

相关问题