【问题标题】:Gson Type Adapter with both custom and default deserialization logic具有自定义和默认反序列化逻辑的 Gson 类型适配器
【发布时间】:2020-04-16 17:37:42
【问题描述】:

我有一个 gson 模型类,其中包含一个名为 duration 的变量,它是一个整数。问题是当这个变量没有值时,服务器没有返回null,而是返回""

列表也是如此,当我期待List<String>? 并且其中没有任何价值时,我得到"" 而不是null。不幸的是,服务器无法更改。

我已经用自定义double 解串器解决了这个问题,但我需要更通用的东西,因为“”是默认的服务器方法。这是我到目前为止的进展,但在 else 分支上我不知道如何告诉它继续使用默认的反序列化器。

internal class BadDeserializer : JsonDeserializer<Any> {

    @Throws(JsonParseException::class)
    override fun deserialize(
            json: JsonElement,
            type: Type,
            context: JsonDeserializationContext): Any? {
        return try {
            val json = json.asString
            if (json.isBlank()) {
                null
            } else {
               //Do nothing and call default behavior (?)
            }
        } catch (e: Exception) {
            throw JsonParseException(e)
        }
    }
}

【问题讨论】:

    标签: kotlin gson


    【解决方案1】:

    这是一个不幸的响应,得到一个空字符串。

    AFAIK 你不能用 GSON 为原始类型注册一个类型适配器,尽管它可能为他们的盒装类型注册一个(不确定这如何与 Kotlin 一起工作)。

    如果您可以使用盒装类型,那么您可以使用类似以下的内容:

    public class DoubleAdapter implements JsonDeserializer<Double> {
    
        @Override
        public Double deserialize(final JsonElement json,
                                  final Type typeOfT,
                                  final JsonDeserializationContext ctx) throws JsonParseException {
            if (!json.isJsonPrimitive()) {
                throw new JsonParseException("primitive expected");
            }
            final JsonPrimitive primitive = json.getAsJsonPrimitive();
    
            if (primitive.isString()) {
                final String value = primitive.getAsString();
                if ("".equals(value)) return null;
                throw new JsonParseException("double expected, not string");
            }
    
            if (!primitive.isNumber()) {
                throw new JsonParseException("double expected");
            }
            return primitive.getAsNumber().doubleValue();
        }
    
    }
    

    尽管为你拥有的任何结构编写一个适配器可能会更简洁(我通常会做任何事情)。

    【讨论】:

    • 感谢您的回答,您的方法很好,但它仅适用于我所说的已修复的双打。这就是为什么我需要一个更广泛的方法来考虑 Double、Int、List 等
    • 哦,我明白了,有点误解了这个问题。我会考虑一下,但您可能可以通过使用 TypeAdapterFactory 来实现这一点 - 我只是想弄清楚如何解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2017-03-06
    • 1970-01-01
    • 2016-04-17
    相关资源
    最近更新 更多