简体   繁体   中英

Why does GSON produce different JSON for enum at custom TypeAdapter?

I wrote a TypeAdapter for a class that contains an enum attribute. This is the write method, which uses standard GSON serialization for the enum value:

    @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();
    }

When using this TypeAdapter , the produced JSON contains this part for the enum:

"type":"\"ENUM_VALUE\""

But when I use gson.toJson(object) on a class which contains this enum without a TypeAdapter, it produces:

"type":"ENUM_VALUE"

All Gson objects use the standard configuration. It produces the same result in the first version, whether I test the TypeAdapter directly or use a Gson and registering it.

Why is there a difference? I guess escaping is not needed here, so I'd like to avoid it. Interestingly, deserialization works for both serialized versions with the TypeAdapter (with gson.fromJson(reader.nextString()) ).

I guess that the problem might occure because gson.toJson(object.getType()) already produces quotes: "ENUM_VALUE" and when adding them to the JsonWriter with writer.value(gson.toJson(object.getType()) it gets escaped. But how to handle this correctly, like GSON does it?

Simply your TypeAdapter is wrong. Replace it with:

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();
}

In your code, you create a string from the enum doing a JSON serialization. This produces "ENUM_VALUE" ( gson.toJson(object.getType()) ), and then it is serialized again into a string so the result is \\"ENUM_VALUE\\" .

In my code, I get the string representation of the enum using the toString() method so no additional quotes are created.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM