gpt4 book ai didi

java - 使用 Moshi 反序列化可以是两种数据类型之一的字段

转载 作者:行者123 更新时间:2023-12-03 11:18:27 25 4
gpt4 key购买 nike

我从 OrientDB 服务器收到一些 JSON,看起来像这样:

{
...
"out": ...,
"in": ...,
...
}

现在这两个字段 outin可以是以下两种类型之一: String和我自己的自定义对象(我们称之为 Record )。例如,对于一个请求,我可能会收到以下信息:
{
...
"out": "#17:0",
"in": {
...
},
...
}

对于另一个我可能会得到:
{
...
"out": {
...
},
"in": "#18:2",
...
}

等等。两者都可能是 String s,两者都可能是 Records , 一个可能是 String另一个是 Record ,等等等等。现在,当我使用 Moshi 反序列化这种 JSON 时, 我有两个参数 outin保存它们各自键的值;但是,因为这些值不是固定的数据类型,所以说起来容易做起来难。

创建多个 POJO(或“POKO”,我猜,因为我使用的是 Kotlin)是行不通的,因为这些对象可以在其他 JSON 对象和类似的东西中找到。我需要一个对象,这些参数可以采用可变数据类型。那我该怎么做呢?

我是否必须在 Moshi 中编写一个自定义适配器来序列化/反序列化这些值?如果是这样,我将如何编写一个可以根据参数值分配某种数据类型的程序?或者是否有某种我可以找到/编写的 Kotlin 类/函数/扩展函数可以容纳两种可能的数据类型?

如果它是相关的,我也使用 Retrofit 2 + RxJava 2 来异步调用我的 HTTP,所以如果这些库中有任何数据类型或函数可以促进这样的事情,我会全力以赴。

即使任何人都只能用 Java 回答也没关系,因为我可以自己转换代码。如果我遗漏了一些明显的东西,我会提前道歉。

最佳答案

你可以像我在这个答案中所做的那样做:https://stackoverflow.com/a/65106419/3543610
基本上,您将创建一个密封类作为您的两个属性的类型 inout .您还需要将原始字符串 one 包装成一个包含 String 的类型,这样您就可以使其扩展密封类,如下所示:

sealed class YourType {
data class StringData(val value: String) : YourType()

@JsonClass(generateAdapter = true)
data class Record(
val prop1: String,
val prop2: Int
) : YourType()
}
那么具有这些属性的模型看起来像:
@JsonClass(generateAdapter = true)
data class Model(
...
val in: YourType,
val out: YourType,
...
)
然后最后为 YourType 编写自定义适配器类型:
class YourTypeCustomAdapter {
@FromJson
fun fromJson(jsonReader: JsonReader, delegate: JsonAdapter<Record>): YourType? {
return if (jsonReader.peek() == BEGIN_OBJECT) {
delegate.fromJson(jsonReader)
} else {
StringData(jsonReader.nextString())
}
}

@ToJson
fun toJson(jsonWriter: JsonWriter, yourType: YourType, delegate: JsonAdapter<Record>) {
when (yourType) {
is Record -> delegate.toJson(jsonWriter, yourType)
is StringData -> jsonWriter.value(yourType.value)
}
}
}
并在 Moshi 注册:
private val moshi = Moshi.Builder()
.add(YourTypeCustomAdapter())
.build()

关于java - 使用 Moshi 反序列化可以是两种数据类型之一的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46078849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com