抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

Gson JsonPrimitive 反转义字符转换

后端给了一个这种格式的 Json 数据:

{
"obj":"[
    {
    \"Name\":\"小明\"
    },
    {
    \"Name\":\"小白\"
    },
    {
    \"Name\":\"小黑\"
    }
    ]"
}

简单来说就是:一个字段的内容为转义后的json,这时无法使用 Gson 直接转换为对象,因为 Gson 无法识别那串转义后的 json。(PS:全部带转义字符的是可以直接解析的)

解决方案:

val parseString = JsonParser.parseString(obj)
val obj = if (parseString.isJsonPrimitive) {
    parseString.asJsonPrimitive.asString
} else {
    obj
}
Gson().fromJson(obj, object : TypeToken<List<Obj>>() {}.type)

先用 JsonParser 解析为 JsonElement,再使用 isJsonPrimitive 判断,至于这个判断根据官方的解释只是用来判断是否为原始数据类型,然后强转为相关类型。

但是通过查看源码可以得知:实际上和直接获取并无不同。

于是后来证明直接解析也可以,打断点也没能走进 asJsonPrimitive 逻辑,可是之前明明是失败的,再仔细看了一眼逻辑,多了一行 :

val parseString = JsonParser.parseString(obj) 

核心就在这里了,转义的字符已经被去除了,于是也就可以解析成功了,以上!

参考:关于Gson解析的使用汇总


本站由以下主机服务商提供服务支持:

0条评论

发表评论