您的当前位置:首页正文

项目中FastJSON 设置PropertyNamingStrategy不生效

2024-11-23 来源:个人技术集锦

首先了解PropertyNamingStrategy
有四种序列化方式。
CamelCase策略,Java对象属性:personId,序列化后属性:persionId – 实际只改了首字母 大写变小写
PascalCase策略,Java对象属性:personId,序列化后属性:PersonId – 实际只改了首字母 小写变大写
SnakeCase策略,Java对象属性:personId,序列化后属性:person_id --大写字母前加下划线
KebabCase策略,Java对象属性:personId,序列化后属性:person-id -大写字母前加减号

注意是将bean转为json时构建json信息时,如果是map,JSONObject不会有这个转换

现象描述

对javaBean转换为json字符串写法
全局设置

SerializeConfig serializeConfig = SerializeConfig.globalInstance;
serializeConfig.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;

可是实际在项目中使用发现,有时并不生效
看一个例子

   System.out.println(SON.toJSONString(riversItemInfo));
     SerializeConfig serializeConfig = SerializeConfig.globalInstance;
        serializeConfig.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
   System.out.println(SON.toJSONString(riversItemInfo));

两次输出中间进行PropertyNamingStrategy的配置,我们预期是第一次输出驼峰,第二次输出
为下划线的形式。但是事实上,第一和第二次输出的都为驼峰的形式。

问题产生原因

查看fastjson源码时,在调用toJSONString时
在获取fastjson的ObjectSerializer时,不知道默认使用全局的SerializeConfig

   public ObjectSerializer getObjectWriter(Class<?> clazz) {
        return config.getObjectWriter(clazz);
    }

会根据SerializeConfig和clazz进行缓存
而ObjectSerializer下面的JavaBeanSerializer或者ASMSerializer都会根据配置的PropertyNamingStrategy对命名进行处理。并且存下来,因此在第一次获取getObjectWriter后,再更改全局的PropertyNamingStrategy就无效了。

解决办法

单独的方法进行设置


SerializeConfig serializeConfig1 = new SerializeConfig();
serializeConfig1.propertyNamingStrategy = PropertyNamingStrategy.CamelCase;
System.out.println(JSON.toJSONString(riversItemInfo,serializeConfig1));

注意:不要轻易设置全局的serializeConfig 。不然可能会产生一些让人意想不到的问题。

显示全文