[alibaba/fastjson]1.2.58,toJSONString(Object)生成了非标准JSON

2024-08-30 795 views
6
Map<Integer, Object> map = new HashMap<>();
map.put(12, new ArrayList<>());
map.put(34, new ArrayList<>());
System.out.println(JSON.toJSONString(map));
//输出: {34:[],12:[]}

其中输出json的key不是String类型,造成生产环境损失 建议在下一个版本,将SerializerFeature.WriteNonStringKeyAsString设置为默认

回答

4

这个目前有对应的参数吗?

3

String s = JSON.toJSONString(map, SerializerFeature.WriteNonStringKeyAsString);

3

@zhulc0914
你可以在程序入口处设置全局化配置,这样就不用在每个toJSONString设置feature JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNonStringKeyAsString.getMask();

但我认为作为通用组件产生非标准的JSON串是不科学的···

4

1.2.36 及以下版本都是标准的 json,升级以后变了变了。

9

@wenshao 温先生好,我看到com.alibaba.fastjson.JSON#DEFAULT_GENERATE_FEATURE被静态代码块初始化,所以JSON.DEFAULT_GENERATE_FEATURE已经包含了一些缺省配置。 可否在下个迭代中加入SerializerFeature.WriteNonStringKeyAsString的缺省配置吗? 感谢!

    public static int DEFAULT_GENERATE_FEATURE;
    static {
        int features = 0;
        features |= SerializerFeature.QuoteFieldNames.getMask();
        features |= SerializerFeature.SkipTransientField.getMask();
        features |= SerializerFeature.WriteEnumUsingName.getMask();
        features |= SerializerFeature.SortField.getMask();
        /*默认序列化为标准JSON*/
        features |= SerializerFeature.WriteNonStringKeyAsString.getMask();
        DEFAULT_GENERATE_FEATURE = features;
    }