为什么GSON会在自定义TypeAdapter中为枚举生成不同的JSON?

时间:2014-05-10 16:09:34

标签: java serialization gson

我为包含enum属性的类写了一个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",并且在JsonWriter添加writer.value(gson.toJson(object.getType())时它会被转义。但是如何正确处理这个问题,就像GSON一样呢?

1 个答案:

答案 0 :(得分: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()方法获取枚举的字符串表示,因此不会创建其他引号。