fastjson小问题

项目中使用到了JSON.toJSONString(),将JSONObject转化为JSONString,转化后的数据出现

"$ref": "$.value.XFT\\-BMXZ79be66f0f8c111ebb73c55e6380c6794[0]"


问题展现

转化之前的数据为JSONObject中有一个

key为:XFT-BMXZ79be66f0f8c111ebb73c55e6380c6794,

value为一个数组,数组中的两个元素相同,如图:

 转化之后,数组的第二个元素出现了"$ref": "$.value.XFT\\-BMXZ79be66f0f8c111ebb73c55e6380c6794[0]"

 经过多次测试,如果数组中的这两个元素内容不相同,则不会出现这种情况,不知道是不是fastJSON的bug

解决:换工具类

我使用了hutool中的JSONUtil.toJsonStr(),正常转化成功

 

### 原因分析 在实际开发中,使用Fastjson进行Java对象和JSON格式转换时,有时会出现字段大小写不符合预期的情况。Fastjson在序列化时会根据get方法的第三个字符后的字符串来判断变量名称,并且默认会将第一个字符设置成小写。同时,Fastjson中的`TypeUtils`里的静态变量`compatibleWithJavaBean`(当做JavaBean来处理)会设置成`True`。这就导致在序列化和反序列化时,字段首字母可能自动变成小写,与预期的大小写形式不符,例如将`ItemCode`转换后可能变成`itemCode` [^1][^3]。 ### 解决方案 #### 使用`@JSONField`注解 可以使用`@JSONField`注解的`name`属性来明确指定字段在JSON输出中的名称,确保大小写符合要求。示例代码如下: ```java import com.alibaba.fastjson.annotation.JSONField; public class User { @JSONField(name = "FullName") private String fullName; public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } } ``` 这样在进行JSON序列化时,`fullName`字段会以`FullName`的形式输出 [^2]。 #### 调整Java对象的getter方法命名 通过调整Java对象的getter方法命名,确保其返回的字段名称大小写符合预期。因为Fastjson序列化依赖getter方法来确定字段名。 #### 追踪方法进行处理 可以追踪到特定方法,如`nameHashCode64`方法,根据`JSONField`注解存在与否及`name`属性情况进行不同处理: ```java private long nameHashCode64(String name, JSONField annotation) { if (annotation != null && annotation.name().length() != 0) { return TypeUtils.fnv1a_64_lower(name); } return TypeUtils.fnv1a_64_extract(name); } ``` 通过这种方式可以对Fastjson的下划线与大小写映射问题进行处理 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值