🤔️问题场景:fastjson2中转JSON字符串时,key会自动将属性首字母转小写?
一、问题还原模拟(💥)
@Data
@Builder
public class TestUser {
@JSONField(name = "ID")
private String Id;
private String Name;
private Integer Age;
private Integer age;
private BigDecimal Salary;
private Boolean isDeleted;
private List<String> hobbies;
private Map<String, String> Tags;
private String memo;
}
测试转字符串(出现了问题 💣💣💣,key值没有和对象属性名保持一致🤔️)
TestUser anonymous = TestUser.builder()
.Id(UUID.randomUUID().toString())
.Name("anonymous")
.Age(99)
.memo("-")
.build();
// {"ID":"1243e654-05b6-4da6-af2b-156b7a223b96","age":99,"memo":"-","name":"anonymous"}
System.out.println(JSONObject.toJSONString(anonymous));
二、解决方案①
- @JsonField(name=“Xxx”)
- JSONWriter.Feature.FieldBased
@Test
void test01() {
TestUser anonymous = TestUser.builder().Id(UUID.randomUUID().toString()).Name("anonymous").Age(99).memo("-").build();
System.out.println(JSONObject.toJSONString(anonymous,
// 键值和属性保持一致(默认会将首字母大写转换为小写), 也可以使用@JsonField注解,注解的优先级最高
// ⚠️⚠️注意:键和属性名保持一致,且会自动根据键进行排序(ASC)
JSONWriter.Feature.FieldBased,
// 格式化
JSONWriter.Feature.PrettyFormat,
// 序列化null(布尔->false, 数值->0, 字符串->"", 列表->[])
JSONWriter.Feature.WriteNullBooleanAsFalse,
JSONWriter.Feature.WriteNullNumberAsZero,
JSONWriter.Feature.WriteNullStringAsEmpty,
JSONWriter.Feature.WriteNullListAsEmpty,
// 序列化null(优先级低, 会被上面针对null的单独设置覆盖)
JSONWriter.Feature.WriteNulls
));
}
转换结果⤵️
{
"Age":99,
"ID":"f71c41b4-6ec6-4cb7-bebb-36a0f0b7fecf",
"Name":"anonymous",
"Salary":0,
"Tags":null,
"age":0,
"hobbies":[],
"isDeleted":false,
"memo":"-"
}
三、解决方案②
使用Gson
- 默认key与对象属性保持一致
- 默认不会对key排序
String json = new Gson().toJson(anonymous);
String json1 = new GsonBuilder()
// 格式化
.setPrettyPrinting()
// 序列化null
.serializeNulls()
.create()
.toJson(anonymous);
之前偶然的机会向fastjson2项目提交过代码,其实认真分析fastjson2后就会发现它暴露了很多API,“多”也具有两面性,如果你认真分析并从业务角度梳理这个组件,你会发现它其实可以轻松完成Map/POJO/JSONString/JSONObject之间的转换,为业务侧开发带来了很大的便利性。
END.