首先了解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 。不然可能会产生一些让人意想不到的问题。