• fastjson,对象转json字符串的过程中对value为null的值的一些处理


    前言

    fastjson是一个非常好用的java库,用于操作对象json序列化等等。

    问题

    最近在写代码的时候遇到问题,通过JSON.toJSONString方法将一个实体对象转为json字符串,转出来发现原本
    对象中value为null的字段被过滤掉了。。。

    实体对象

    package so.sao.code;
    
    import lombok.Data;
    
    @Data
    public class Person {
    
        String name;
    
        String gender;
    
        String nickname;
    
        String phone;
    
    }
    

    测试代码

        public static void main(String[] args) {
            Person person = new Person();
            person.setName("wyz");
            String json = JSON.toJSONString(person);
            System.out.println(json);
        }
    

    输出结果

    发现只有设置了值的字段name才有输出,而其余为空的字段则都被过滤掉了

    解决

    怎样让值为null的key不被过滤掉

    • 设置SerializerFeature

    设置SerializerFeature里面有很多特性可以使用

    要让空值也能够输出的特性值是SerializerFeature.WriteMapNullValue

    改造代码:

        public static void main(String[] args) {
            Person person = new Person();
            person.setName("wyz");
    //        String json = JSON.toJSONString(person);
    //        System.out.println(json);
    
            // 设置SerializerFeature
            System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
        }
    

    输出结果:

    值为null属性直接放到json字符串里面不太好看,能不能把null值转成其他的值,比如空字符串

    这个时候就需要用到过滤器了,仔细看看JSON.toJSONString的其他几个方法

    toJSONString方法中可以放一个或多个过滤器,常用的过滤器有以下几种:

    要实现把null值转为空字符串的效果可以使用ValueFilter

    代码实现:

        public static void main(String[] args) {
            Person person = new Person();
            person.setName("wyz");
    //        String json = JSON.toJSONString(person);
    //        System.out.println(json);
    
            // 设置SerializerFeature
    //        System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
    
            // 设置NameFilter
            System.out.println(JSON.toJSONString(person, (ValueFilter) (object, name, value) -> {
                if(value == null){
                    return "";
                }
    
                return value;
            }));
        }
    

    输出结果:

    一个特殊的需求,有的值为null需要过滤,有的又不需要过滤。。。(这就是我遇到的)

    使用PropertyFilter

    代码实现:

        public static void main(String[] args) {
            Person person = new Person();
            person.setName("wyz");
    //        String json = JSON.toJSONString(person);
    //        System.out.println(json);
    
            // 设置SerializerFeature
    //        System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
    
            // 设置NameFilter
    //        System.out.println(JSON.toJSONString(person, (ValueFilter) (object, name, value) -> {
    //            if(value == null){
    //                return "";
    //            }
    //
    //            return value;
    //        }));
    
            // 设置PropertyFilter
            System.out.println(JSON.toJSONString(person, new PropertyFilter() {
                @Override
                public boolean apply(Object object, String name, Object value) {
                    return name.equals("gender") || value != null;
                }
            }, SerializerFeature.WriteMapNullValue));
        }
    

    输出结果:

  • 相关阅读:
    C# WinForm程序中强制退出程序以及启动程序
    WinForm程序中对关闭按钮的操作
    DataTable转换为List
    json日期转换
    ajax局部刷新
    程序暂停或延迟几秒再次运行
    分页显示的制作流程
    Django 项目基础操作总结
    Django初识
    Mysql有关分页的操作
  • 原文地址:https://www.cnblogs.com/alinainai/p/13410149.html
Copyright © 2020-2023  润新知