一、前言
最近用到了json字符串转java对象的方法。
import com.alibaba.fastjson2.JSON;
//String resultObjectJosn = JsonUtil.getJSONString(resultObject.getResultObject());
String resultObjectJosn = "{\"ShippingDate\":\"20250801\",\"OverseaConsignment_Addr1\":\"xxx\"}";;
List<ShippingInfoDto> shippingInfoDtos = JSON.parseArray(resultObjectJosn, ShippingInfoDto.class);
大概就这个意思,调用了个接口查询回来json字符串,然后需要转为javabean对象。
因为返回的json字符串比较奇葩,不是按照驼峰规则的,而是ShippingDate,OverseaConsignment_Addr1这种,所以转换后对应的javabean字段总是为空。
二、错误的解决方法
查了下gpt,解决方法是有的,但是是错误的。
记录下,避免这个错误。
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
@Data
public class ShippingInfoDto {
@JSONField(name = "ShippingDate")
private String ShippingDate;
@JSONField(name = "OverseaConsignment_Addr1")
private String OverseaConsignment_Addr1;
}
gpt给的解决方法是,因为用的是fastjson2,所以用注解
@JSONField,加上就能转换成功了。
实际测试发现,并不行。
用JSON.parseArray转出来的javabean对象,对应的值还是null。
三、正确的解决方法
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
@Data
public class ShippingInfoDto {
private String ShippingDate;
private String OverseaConsignment_Addr1;
public String getShippingDate() {
return ShippingDate;
}
//TODO 还有很多没有值,用到字段记得加
@JSONField(name = "ShippingDate")
public void setShippingDate(String shippingDate) {
ShippingDate = shippingDate;
}
public String getOverseaConsignment_Addr1() {
return OverseaConsignment_Addr1;
}
//TODO 还有很多没有值,用到字段记得加
@JSONField(name = "OverseaConsignment_Addr1")
public void setOverseaConsignment_Addr1(String overseaConsignment_Addr1) {
OverseaConsignment_Addr1= overseaConsignment_Addr1;
}
}
经过测试,这样才是正确的解决方法,注解加到set方法上才行。
虽然有@Data注解,不用写get和set方法也行;
但是把@JSONField注解加到变量上还是不行,转换后没有值;
只有加在set方法上,才能转换时把json对应的值设置给javabean。
四、总结
1.注解要与json转换方法匹配;本例子用的是import com.alibaba.fastjson2.JSON;
2.json返回值不是驼峰规则,默认转换后javabean的变量值为空时;
只把javabean的变量名改成与json一致没有用(原本的shippingDate或者改成ShippingDate都不行);
需要给set方法加 @JSONField注解,才能把json里的值获取到(ShippingDate)、设置给javabean。



2772

被折叠的 条评论
为什么被折叠?



