如何使用 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)
    }
}