从JSON值解析JSON对象字符串

时间:2019-07-18 16:57:08

标签: json kotlin kotlinx.serialisation

我正在向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)

2 个答案:

答案 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))