Java 未调用Gson序列化方法
我试图使用Google的Gson和JsonSerializer接口将我的对象序列化回JSON,虽然反序列化工作得很好,但序列化不调用serialize方法 序列化程序/反序列化程序类Java 未调用Gson序列化方法,java,json,serialization,gson,Java,Json,Serialization,Gson,我试图使用Google的Gson和JsonSerializer接口将我的对象序列化回JSON,虽然反序列化工作得很好,但序列化不调用serialize方法 序列化程序/反序列化程序类 public enum JsonParser implements JsonDeserializer<Object>, JsonSerializer<Object> { LANGUAGE(Language.class) { @Override publ
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;
}
}
公共枚举JsonParser实现JsonDeserializer,JsonSerializer{
语言(语言类){
@凌驾
公共语言反序列化(JsonElement元素、类型、JsonDeserializationContext){
返回语言.valueOf(elem.getAsString());
}
@凌驾
公共JsonElement序列化(对象对象、类型、JsonSerializationContext){
返回新的JsonPrimitive(((语言)对象).getCode());
}
},
数据类型(DataType.class){
@凌驾
公共数据类型反序列化(JsonElement元素,类型类型,JsonDeserializationContext){
返回DataType.getByIdentifier(elem.getAsString());
}
@凌驾
公共JsonElement序列化(对象对象、类型、JsonSerializationContext){
系统输出打印(“测试”);
返回新的JsonPrimitive(((数据类型)对象).getIdentifier();
}
};
私人期末班;
JsonParser(类clazz){
this.clazz=clazz;
}
公共类getParserClass(){
回击声;
}
}
和测试:
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));
GsonBuilder GsonBuilder=new GsonBuilder();
for(JsonParser jp:JsonParser.values())
registerTypeAdapter(jp.getParserClass(),jp);
Gson-Gson=gsonBuilder.create();
字符串json=“{\'type1\\”:{\'da\':\'Some String\',\'pt\'BR\':\'More strings\',\'pl\':\'String 3\',\'eo\':'String 4\','type2\':{\'pl\':'String 5\','pt\'u BR\':'String 6\','ru\':'String 7\';
Map Map=gson.fromJson(json,newTypeToken(){}.getType());
系统输出打印项次(map);
System.out.println(gson.toJson(map));
虽然fromJson()返回正确的对象,但toJSON()使用来自对象的默认toString(),而不是serialize()方法中指定的方法
似乎序列化程序由于某种原因没有注册(测试打印输出没有显示)
谢谢您的建议。Gson将使用
EnumTypeAdapter
对您的enum进行反序列化,因为如果我正确理解了Gson的内部结构,这个类型适配器将比使用序列化程序的反射适配器更早被调用
这将向您介绍如何更改枚举的JSON序列化(使用
TypeAdapter
)我尝试序列化的不是枚举,而是类。这里的枚举仅用于将所有序列化程序保存在一个位置。请您将其余的代码也放在这里,以便我更好地理解您正在尝试执行的操作。使用序列化程序,所有操作都应正常工作