Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未调用Gson序列化方法_Java_Json_Serialization_Gson - Fatal编程技术网

Java 未调用Gson序列化方法

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

我试图使用Google的Gson和JsonSerializer接口将我的对象序列化回JSON,虽然反序列化工作得很好,但序列化不调用serialize方法

序列化程序/反序列化程序类

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

我尝试序列化的不是枚举,而是类。这里的枚举仅用于将所有序列化程序保存在一个位置。请您将其余的代码也放在这里,以便我更好地理解您正在尝试执行的操作。使用序列化程序,所有操作都应正常工作