没有调用Gson序列化方法

时间:2013-11-25 15:22:39

标签: java json serialization gson

我正在尝试使用Google的Gson使用JsonSerializer接口将我的对象序列化回JSON,而反序列化工作正常,序列化不会调用serialize方法。

Serializer / Deserializer classes

public enum JsonParser implements JsonDeserializer<Object>, JsonSerializer<Object> {
    LANGUAGE(Language.class) {
        @Override
        public Language deserialize(JsonElement elem, Type type, JsonDeserializationContext context) {
            return Language.valueOf(elem.getAsString());
        }

        @Override
        public JsonElement serialize(Object object, Type type, JsonSerializationContext context) {
            return new JsonPrimitive(((Language) object).getCode());
        }
    },
    DATA_TYPE(DataType.class) {
        @Override
        public DataType deserialize(JsonElement elem, Type type, JsonDeserializationContext context) {
            return DataType.getByIdentifier(elem.getAsString());
        }

        @Override
        public JsonElement serialize(Object object, Type type, JsonSerializationContext context) {
            System.out.println("test");
            return new JsonPrimitive(((DataType) object).getIdentifier());
        }
    };

    private final Class clazz;
    JsonParser(Class clazz) {
        this.clazz = clazz;
    }

    public Class getParserClass() {
        return clazz;
    }
}

测试:

GsonBuilder gsonBuilder = new GsonBuilder();
    for(JsonParser jp : JsonParser.values())
        gsonBuilder.registerTypeAdapter(jp.getParserClass(), jp);
    Gson gson = gsonBuilder.create();

    String json = "{\"type1\":{\"da\":\"Some string\",\"pt_BR\":\"More strings\",\"pl\":\"String 3\",\"eo\":\"String 4\"},\"type2\":{\"pl\":\"String 5\",\"pt_BR\":\"String 6\",\"ru\":\"String 7\"}}";
    Map<DataType, Map<Language, String>> map = gson.fromJson(json, new TypeToken<Map<DataType, Map<Language, String>>>(){}.getType());
    System.out.println(map);
    System.out.println(gson.toJson(map));

当fromJson()返回正确的对象时,toJSON()使用对象的默认toString()而不是serialize()方法中指定的方法。

似乎序列化器由于某种原因没有注册(测试打印输出没有显示)。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

Gson将使用EnumTypeAdapter来反序列化你的枚举,因为如果我正确理解了Gson的内部结构,那么这个类型的适配器将会被反射之前调用,它会反过来使用你的序列化器。

question将向您介绍如何更改枚举的JSON序列化(使用TypeAdapter