如何使用 Gson TypeAdapter 摆脱价值?
How to get rid of the value using a Gson TypeAdapter?
我有一个 json 字符串,如下所示:
{ "SomeStringProperty": { "value":"StringValue"},
"SomeIntProperty": { "value": 1},
"SomeBooleanProperty": {"value": true}
}
如何将其映射到以下对象
data class PoJo(val SomeStringProperty: String,//
val SomeIntProperty: Int,//
val SomeBooleanProperty: Boolean)
应该可以为所有可能被包装的类型注册一个 TypeAdapterFactory
。然后工厂委托给实际的适配器。当且仅当 json 包含一个名为 "value"
的单个 属性 时,它才会将此 属性 值提供给委托。
实施应类似于以下内容。这里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 字符串,如下所示:
{ "SomeStringProperty": { "value":"StringValue"},
"SomeIntProperty": { "value": 1},
"SomeBooleanProperty": {"value": true}
}
如何将其映射到以下对象
data class PoJo(val SomeStringProperty: String,//
val SomeIntProperty: Int,//
val SomeBooleanProperty: Boolean)
应该可以为所有可能被包装的类型注册一个 TypeAdapterFactory
。然后工厂委托给实际的适配器。当且仅当 json 包含一个名为 "value"
的单个 属性 时,它才会将此 属性 值提供给委托。
实施应类似于以下内容。这里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)
}
}