gpt4 book ai didi

json - 如何使用 Gson TypeAdapter 摆脱值(value)?

转载 作者:行者123 更新时间:2023-12-02 13:34:47 27 4
gpt4 key购买 nike

我有一个如下所示的 json 字符串:

{ "SomeStringProperty": { "value":"StringValue"},
"SomeIntProperty": { "value": 1},
"SomeBooleanProperty": {"value": true}
}

如何将其映射到以下对象
data class PoJo(val SomeStringProperty: String,//
val SomeIntProperty: Int,//
val SomeBooleanProperty: Boolean)

最佳答案

应该可以注册一个TypeAdapterFactory对于所有可能被包装的类型。然后工厂委托(delegate)给实际的适配器。当且仅当 json 包含一个名为 "value" 的属性它会改为将此属性值提供给委托(delegate)。

实现应该类似于以下内容。这里write总是写入原始值和 read遵循上面的想法。

class GenericAdapterFactory : TypeAdapterFactory {

override fun <T> create(gson: Gson, TypeToken<T> type): TypeAdapter<T> {
val delegateAdapter = gson.getDelegateAdapter(this, type)
val jsonAdapter = gson.getAdapter(JsonElement::class.java)
return GenericAdapter<T>(delegateAdapter, jsonAdapter)
}
}

class GenericAdapter<T>(
private val delegateAdapter: TypeAdapter<T>,
private val jsonAdapter: TypeAdapter<JsonElement>
) : TypeAdapter<T> {

override fun read(reader: JsonReader): T {
if (reader.peek() != BEGIN_OBJECT)
return delegateAdapter.read(reader)
var element = jsonAdapter.read(reader)
element = with(element.asJsonObject) {
takeIf { element.entrySet().size == 1 }?.get("value")
} ?: element
return delegateAdapter.fromJsonTree(element)
}

override fun write(writer: JsonWriter, value: T) {
delegateAdapter.write(writer, value)
}
}

关于json - 如何使用 Gson TypeAdapter 摆脱值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59245075/

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