从 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 对象时 JSONSerilazation 不起作用