Json序列化问题

public class Test2 {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        PluginSdkModel pluginSdkModel = new PluginSdkModel();

        for (int i = 0; i < 3; i++) {
            pluginSdkModel.setSdkId(123L);
            if(i == 1){
                pluginSdkModel.setModelDesc("wokao");
            }
            System.out.println(objectMapper.writeValueAsString(pluginSdkModel));
        }
    }
}

输出:

{"sdkId":123}
{"sdkId":123,"modelDesc":"wokao"}
{"sdkId":123,"modelDesc":"wokao"}

可以看到 第三个结果页输出了 modeDesc,原因是 序列化的时候,是把 对象的值 序列化成字符串,无法先把对象的值清空,所以 序列化 每次 初始化 object 是不现实的,也是无法 解决的问题;需要开发人员自己 优化代码来解决,比如上面的 代码 可以修改下:

        for (int i = 0; i < 3; i++) {
            pluginSdkModel.setSdkId(123L);
            if(i == 1){
                pluginSdkModel.setModelDesc("wokao");
            }else { //这里加上 else 就可以解决 这个问题,否则 json框架是无法解决的
                pluginSdkModel.setModelDesc(null);
            }
            System.out.println(objectMapper.writeValueAsString(pluginSdkModel));
        }

Json 反序列化问题

序列化时,无法 先把 对象的值 修改成 null,再序列化;那么反序列化呢,发序列化 字符串 ---> object的过程,是可以先把 object清空,然后在序列化的;

Jackson 也 如我们预想的那样,做了这件事,这样可以有助于 最大化 帮住开发者减少bug;

public class Test {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        PluginSdkModel pluginSdkModel = new PluginSdkModel();

        String json1 = "{\"sdkId\":123}";
        String json2 = "{\"sdkId\":123,\"modelDesc\":\"wokao\"}";

        for (int i = 0; i < 2; i++) {
            pluginSdkModel = objectMapper.read(json2, PluginSdkModel.class);

            System.out.println(objectMapper.writeValueAsString(pluginSdkModel));

            pluginSdkModel = objectMapper.readValue(json1, PluginSdkModel.class);

            System.out.println(objectMapper.writeValueAsString(pluginSdkModel));
        }
    }
}

输出:

{"sdkId":123,"modelDesc":"wokao"}
{"sdkId":123}
{"sdkId":123,"modelDesc":"wokao"}
{"sdkId":123}

可以看到 objectMapper.readValue(json2, PluginSdkModel.class); 时,每次 产生一个 全新的 pluginSdkModel,在Java里 是 内存自动管理的,可以这么搞,在Delphi里 不方便这么搞,但是 可以 反序列化时,清空 源 object 里的 每一个字段;从而帮助开发者减少bug,实现与Java里 一样的效果;

posted on 2024-07-29 12:30  del88  阅读(5)  评论(0编辑  收藏  举报