从 json 值解析 JSON 对象字符串

Posted

技术标签:

【中文标题】从 json 值解析 JSON 对象字符串【英文标题】:Parse JSON object string from json value 【发布时间】:2019-11-27 16:17:09 【问题描述】:

我正在向 API 发出请求,响应是一个 JSON 对象,这个 json 对象包含一个字符串,它是另一个 json 对象。我正在尝试使用 kotlinx.serialization 来处理这个对象的反序列化。

我可以自己重写反序列化功能,但这会破坏使用这个库的意义

我希望这样的事情会奏效。

@Serializable
data class Foo(val data: Data)

@Serializable
data class Data(val foo: String)

对于类似下面的对象


  "data":"\"foo\":\"bar\""

我希望得到一个对象 Foo,其属性数据 = 对象数据,属性 foo = "bar"

但是我得到以下错误

java.lang.IllegalStateException: Expected class kotlinx.serialization.json.JsonArray (Kotlin reflection is not available) but found class kotlinx.serialization.json.JsonLiteral (Kotlin reflection is not available)

【问题讨论】:

嗨,@spoderbiggen 你想要这个 JSON 作为你的模型(pojo)类吗? @HappySingh 是的,如果我没有在我的问题中说明这一点,我很抱歉 别抱歉。我已经添加了我的答案。 Cannot convert JSON data properly的可能重复 【参考方案1】:

您没有指定如何进行反序列化。 要获得您所期望的,您必须指定正确的序列化程序。

val expectedFoo = Json.parse(Foo.serializer(), """"data":"foo":"bar"""")

注意 在我的回答中,我假设您打算使用稍微不同的示例字符串。

在您的示例 json 字符串中,data 键对应于字符串值,而不是对象。 请看下面的区别:


  "data":"\"foo\":\"bar\""


  "data":  "foo": "bar" 

因此,在任何情况下,要解析原始示例,您都需要使用一些中间表示并解析其间的字符串表示。

@Serializable
data class Intermediate(val data: String)
//...
val intermediateFoo = Json.parse(Intermediate.serializer(), """"data":"\"foo\":\"bar\""""")
val expectedFoo = Foo(data = Json.parse(Data.serializer(), intermediateFoo.data))

【讨论】:

以上是关于从 json 值解析 JSON 对象字符串的主要内容,如果未能解决你的问题,请参考以下文章

JSON 字符串上的 JSON 解析抛出“无法将对象转换为原始值”

仅使用字符串和值解析 JSON 对象

[对象值使用JSON解析显示具有相同名称的对象和字符串

解析 JSON 对象时 JSONSerilazation 不起作用

解析字典的最快pythonic方法,其中值是字节字符串化的json对象

Azure 数据流:从 JSON 字符串解析对象的嵌套列表