[alibaba/fastjson]空的List或者是数组默认序列化成[],怎么可以忽略,不进行序列化

2024-05-23 817 views
4

例如: public static void main(String[] args) { List<String> list = new ArrayList<>(); Map<String, List<String>> map = new HashMap<>(); map.put("list", list); System.out.println(JSON.toJSONString(map)); }

默认输出结果为 {"list":[]}

怎么样输出结果变成 {}

回答

6

JSON.toJSONString(bean, features...) features包含了很多序列化规则可以自行设置

1

@CeresY SerializerFeature里面没有找到相关的配置。

9

请问问题解决了吗,我也遇到了。

0

@pinkopen 我这边没有进行处理,不影响使用。 给一个不不建议使用的方法,可以使用SerializeFilter判断vlaue的类型是否为Collection或者Iterable,然后将其设置为null返回即可。理论上是可行的,我没有进行测试。 但是不推荐这么使用,最好在序列化前,业务逻辑处理上就list就设置为null。 原因是,如果这个问题确实是一个bug的话,我认为楼主会把这样的问题做成一个SerializerFeature进行处理的。

9

可以用com.alibaba.fastjson.serializer.PropertyFilter来处理这种情况,实例代码如下:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.PropertyFilter;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public final class MainFastJSONEmptyCase {
    // 过滤掉null/空数组,空字符串,空List,空Map
    private static PropertyFilter filter = new PropertyFilter() {
        @Override
        public boolean apply(Object object, String name, Object value) {
            if (value == null) {
                return false;
            }
            if (value.getClass().isArray()) {
                if (Array.getLength(value) == 0) {
                    return false;
                }
            }
            if (value instanceof String && ((String) value).isEmpty()) {
                return false;
            }
            if (value instanceof List && ((List) value).size() == 0) {
                return false;
            }
            if (value instanceof Map && ((Map) value).size() == 0) {
                return false;
            }
            return true;
        }
    };

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();
        map.put("list", list);
        System.out.println(JSON.toJSONString(map, filter));
    }
}

输出如下:

{}

这种技巧可以有效的减少数据传输大小,但是业务上要注意null和空数组的差异,以免出现NPE。