gpt4 book ai didi

java - Gson序列化方法没有被调用

转载 作者:太空宇宙 更新时间:2023-11-04 15:23:06 25 4
gpt4 key购买 nike

我正在尝试使用 Google 的 Gson 使用 JsonSerializer 接口(interface)将我的对象序列化回 JSON,虽然反序列化工作得很好,但序列化不会调用序列化方法。

序列化器/反序列化器类

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() 方法中指定的方法。

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

感谢您的任何建议。

最佳答案

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

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

关于java - Gson序列化方法没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20196720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com