项目中FastJSON 设置PropertyNamingStrategy不生效

news/2024/12/5 13:05:58/

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


http://www.ppmy.cn/news/434631.html

相关文章

理解命令行: 一种强大的IT工具

理解命令行: 一种强大的IT工具 在当今数字化时代&#xff0c;计算机已经成为我们生活中不可或缺的一部分。作为IT从业者或计算机爱好者&#xff0c;了解和掌握各种工具和技术是至关重要的。而其中一个强大而受欢迎的工具就是命令行。 什么是命令行&#xff1f; 命令行是一种通…

京东架构师复盘2022最新最全最实用2340页面试题jvm+spring+redis+MQ+微服务PDF

题库第2版 包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿…

python模拟安卓手机点击,支付宝打年兽,未完待续

环境 windows 10&#xff0c;python3,adb import subprocess import time # 试试中文变量名# 变量 adb_help adb help adb_connect adb connect adb_getevent adb shell getevent adb_max_x adb shell getevent -p | find "0035" adb_max_y adb shell getevent…

Ansible源码学习(一)

一、背景说明 基于Ansible1.1源码学习 二、目录结构 ansible核心目录 ansible ├─bin # 入口命令 │ ├─ansible │ ├─ansible-doc │ ├─ansible-playbook │ ├─ansible-pull ├─lib # 核心代码 │ └─ansible │ ├─callback_plugins …

Leetcode 2340. Minimum Adjacent Swaps to Make a Valid Array [Python]

Greedy 找到最靠左的最小数字&#xff0c;找到最靠右的最大数字&#xff0c;查看最小数字往左边需要挪动几次&#xff08;假设为n次&#xff09;&#xff0c;同理&#xff0c;查看最大数字往右边需要挪动几次&#xff08;假设为m次&#xff09;。如果两者会在挪动过程中见面&am…

每日健康上报代码(自用)

广白每日健康上报在这里插入代码片 auto.waitFor(); //这里设置你手机的PING密码&#xff08;纯数字的开屏密码&#xff09; 043006是我的 var passworld "043006" device.wakeUp() setScreenMetrics(1080, 2340) swipe(166,2100,170,1400,500) sleep(1000) var le…

高ppi的iPhone 12 mini的图标是非标准的3倍图

iPhone 12 mini 5.4英寸屏 官方给的逻辑像素分辨率是&#xff1a;2340 x 1080 &#xff0c;476 ppi&#xff0c;模拟器获取到的物理像素&#xff1a;812 x 375&#xff0c;[UIScreen mainScreen].scale 倍率:3。可以看到它不是标准的3倍&#xff0c;而是这个奇怪的2.88倍率近似…

华为mate40和小米10哪个好

小米10&#xff1a;用了一块6.67英寸的双曲面打孔屏&#xff0c;支持90Hz刷新&#xff0c;AMOLED屏&#xff0c;由三星和华星光电两家供应&#xff0c;拥有500万&#xff1a;1对比度&#xff0c;1120nit峰值亮度&#xff0c;支持PDCI-P3广色域、HDR10高动态范围图像显示华为mat…