从JSON值解析JSON对象字符串

从JSON值解析JSON对象字符串,json,kotlin,kotlinx.serialization,Json,Kotlin,Kotlinx.serialization,我向一个API发出请求,响应是一个JSON对象,这个JSON对象包含一个字符串,这个字符串是另一个JSON对象。我正在尝试使用kotlinx.serialization来处理此对象的反序列化 我可以自己重写反序列化功能,但这样做会破坏使用这个库的意义 我希望这样的事情能奏效 @Serializable data class Foo(val data: Data) @Serializable data class Data(val foo: String) 对于类似以下对象的对象 { "d

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

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

我希望这样的事情能奏效

@Serializable
data class Foo(val data: Data)

@Serializable
data class Data(val foo: String)
对于类似以下对象的对象

{
  "data":"{\"foo\":\"bar\"}"
}
{
  "data":"{\"foo\":\"bar\"}"
}
我希望得到一个具有property data=Object data和property 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)

我建议您使用Gson-Android以实现更好的序列化

1。将此库添加到你的应用程序升级文件中

dependencies {
  implementation 'com.google.code.gson:gson:2.8.5'
}
2.对于您的回答,您有一位家长的数据,其中,您有foo。这是一个响应的模型类

{
  "data":"{\"foo\":\"bar\"}"
}

现在你可以用这个来存储你的数据了

val myData = MyData(data = Data(foo = "bar")) 

OR

val myData = MyData(Data("bar"))

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

val expectedFoo = Json.parse(Foo.serializer(), """{"data":{"foo":"bar"}}""")
注意 在我的回答中,我假设您打算使用稍微不同的示例字符串

在示例json字符串中,
data
键对应于字符串值,而不是对象。 请查看以下各项之间的差异:

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

@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))

你好,@spoderbiggen你想把这个JSON作为你的模型(pojo)类,对吗?@HappySingh是的,如果我在问题中没有说清楚,我很抱歉,不要抱歉。我已经添加了我的答案。可能是重复的
{
  "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))