我已经使用Moshi 和CustomAdaptor 解决了这个问题。经过大量研究,我无法找到更好的“开箱即用”解决方案。此解决方案位于 kotlin 中,但也可以轻松移植到 Java。
首先让我们在这里定义我们试图解析的类型。我将调用包装器类型,其中包含mixList、Response:
@JsonClass(generateAdapter = true)
data class Response(val mix_types: Data)
以及StringData 和ImageData 列表中的两种不同类型:
sealed class Data {
data class StringData(val value: String) : Data()
@JsonClass(generateAdapter = true)
data class ImageData(
val imageUrl: String,
val height: Int,
val width: Int
) : Data()
}
由于我使用的是 Moshi 代码生成,所以我用 @JsonClass(generateAdapter = true) 注释了 Response 和 ImageData,以便 Moshi 将为这些类型生成适配器(我将在我的自定义适配器中利用它) .
我想为 Data 类型提供我自己的自定义适配器,我也不希望 Moshi 为 StringData 类型生成适配器,因为这正是我想要序列化/反序列化为字符串,所以我不会注释这些类。
现在我要像这样编写我的自定义适配器:
class DataCustomAdapter {
@FromJson
fun fromJson(jsonReader: JsonReader, delegate: JsonAdapter<ImageData>): Data? {
return if (jsonReader.peek() == BEGIN_OBJECT) {
delegate.fromJson(jsonReader)
} else {
StringData(jsonReader.nextString())
}
}
@ToJson
fun toJson(jsonWriter: JsonWriter, data: Data, delegate: JsonAdapter<ImageData>) {
when (data) {
is ImageData -> delegate.toJson(jsonWriter, data)
is StringData -> jsonWriter.value(data.value)
}
}
}
现在缺少的只是向 Moshi 注册自定义适配器:
private val moshi = Moshi.Builder()
.add(DataCustomAdapter())
.build()