Spi*_*gen 6 json kotlin kotlinx.serialization
我正在向 API 发出请求,响应是一个 JSON 对象,该 json 对象包含一个字符串,该字符串是另一个 json 对象。我正在尝试使用 kotlinx.serialization 来处理该对象的反序列化。
我可以自己重写反序列化功能,但这违背了使用这个库的意义
我希望这样的事情能够奏效。
@Serializable
data class Foo(val data: Data)
@Serializable
data class Data(val foo: String)
Run Code Online (Sandbox Code Playgroud)
对于类似以下对象的东西
{
"data":"{\"foo\":\"bar\"}"
}
Run Code Online (Sandbox Code Playgroud)
我期望获得一个具有属性 data = Object Data 且属性 foo = "bar" 的对象 Foo
但是我收到以下错误
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)
Run Code Online (Sandbox Code Playgroud)
您没有指定如何进行反序列化。为了获得您所期望的结果,您必须指定正确的序列化器。
val expectedFoo = Json.parse(Foo.serializer(), """{"data":{"foo":"bar"}}""")
Run Code Online (Sandbox Code Playgroud)
注意 在我的回答中,我假设您打算使用稍微不同的示例字符串。
在您的示例 json 字符串中,data
键对应于 String 值,而不是对象。请查看以下内容之间的区别:
{
"data":"{\"foo\":\"bar\"}"
}
Run Code Online (Sandbox Code Playgroud)
{
"data": { "foo": "bar" }
}
Run Code Online (Sandbox Code Playgroud)
因此,在任何情况下,要解析原始示例,您都需要使用一些中间表示形式并解析中间的字符串表示形式。
@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))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6136 次 |
最近记录: |