【问题标题】:Parse JSON object string from json value从 json 值解析 JSON 对象字符串
【发布时间】: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 是的,如果我没有在我的问题中说明这一点,我很抱歉
  • 别抱歉。我已经添加了我的答案。

标签: json kotlin kotlinx.serialization


【解决方案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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多