【问题标题】:Why does GSON produce different JSON for enum at custom TypeAdapter?为什么 GSON 在自定义 TypeAdapter 中为枚举生成不同的 JSON?
【发布时间】:2014-05-10 16:09:33
【问题描述】:

我为一个包含枚举属性的类写了一个TypeAdapter。这是write 方法,它对枚举值使用标准 GSON 序列化:

    @Override
    public void write(JsonWriter writer, MyClass object) throws IOException {
        if (object == null) {
            writer.nullValue();
            return;
        }
        writer.beginObject();
        writer.name("type").value(gson.toJson(object.getType())); //this is the enum
        writer.endObject();
    }

当使用这个TypeAdapter时,生成的JSON包含这个枚举部分:

"type":"\"ENUM_VALUE\""

但是当我在一个包含这个没有 TypeAdapter 的枚举的类上使用 gson.toJson(object) 时,它会产生:

"type":"ENUM_VALUE"

所有Gson 对象都使用标准配置。它在第一个版本中产生相同的结果,无论我是直接测试TypeAdapter 还是使用Gson 并注册它。

为什么会有差异?我想这里不需要转义,所以我想避免它。 有趣的是,反序列化适用于带有TypeAdapter(带有gson.fromJson(reader.nextString()))的两个序列化版本。

我猜这个问题可能会发生,因为gson.toJson(object.getType()) 已经产生了引号:"ENUM_VALUE",并且当使用writer.value(gson.toJson(object.getType()) 将它们添加到JsonWriter 时,它会被转义。但是如何像 GSON 那样正确处理呢?

【问题讨论】:

    标签: java serialization gson


    【解决方案1】:

    只是您的TypeAdapter 是错误的。替换为:

    public void write(JsonWriter writer, MyClass object) throws IOException {
        if (object == null) {
            writer.nullValue();
            return;
        }
        writer.beginObject();
        writer.name("type").value(object.getType().toString()); //this is the enum
        writer.endObject();
    }
    

    在您的代码中,您从枚举中创建一个字符串,执行 JSON 序列化。这将产生"ENUM_VALUE" (gson.toJson(object.getType())),然后再次序列化为字符串,因此结果为\"ENUM_VALUE\"

    在我的代码中,我使用 toString() 方法获取枚举的字符串表示形式,因此不会创建额外的引号。

    【讨论】:

      猜你喜欢
      • 2013-10-19
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多