我正在向API发出请求,响应是一个JSON对象,此json对象包含一个字符串,该字符串是另一个json对象。我正在尝试使用kotlinx.serialization处理该对象的反序列化。
我本人可以覆盖反序列化功能,但这种用法无法使用该库
我希望像这样的事情能奏效。
@Serializable
data class Foo(val data: Data)
@Serializable
data class Data(val foo: String)
对于类似以下对象的东西
{
"data":"{\"foo\":\"bar\"}"
}
我希望得到一个属性数据=属性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)
答案 0 :(得分:0)
我建议您使用Gson Android以获得更好的序列化。
1。。将此库添加到您的应用Gradle文件中
dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}
2。对于您的回答,您有一个父级数据,其中有 foo 。这是响应的模型类。
{
"data":"{\"foo\":\"bar\"}"
}
是
import com.google.gson.annotations.SerializedName
data class MyData(
@SerializedName("data")
val `data`: Data? = null
)
data class Data(
@SerializedName("foo")
var foo: String? = null
)
现在您可以使用此
存储数据val myData = MyData(data = Data(foo = "bar"))
OR
val myData = MyData(Data("bar"))
答案 1 :(得分:0)
您未指定反序列化的方式。 要在那里获得期望的结果,您必须指定正确的序列化器。
val expectedFoo = Json.parse(Foo.serializer(), """{"data":{"foo":"bar"}}""")
注意 在我的回答中,我假设您打算使用稍微不同的示例字符串。
在示例json字符串中,data
键对应于String值,而不是对象。
请查看以下内容之间的区别:
{
"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))