Java對象轉(zhuǎn)Json,關(guān)于@JSONField對象字段重命名和順序問題
Java對象轉(zhuǎn)Json,@JSONField對象字段重命名和順序
一、引入maven依賴
? ? ? ? <dependency> ? ? ? ? ? ? <groupId>com.alibaba</groupId> ? ? ? ? ? ? <artifactId>fastjson</artifactId> ? ? ? ? ? ? <version>1.2.66</version> ? ? ? ? </dependency>
二、字段重命名
1.創(chuàng)建一個測試實體
import lombok.Data;?
import java.io.Serializable;
?
/**
?* @類名 WeChatBusinessLicenseInfo
?* @描述 營業(yè)執(zhí)照/登記證書信息(測試用)
?* @版本 1.0
?* @創(chuàng)建人 XuKang
?* @創(chuàng)建時間 2021/12/24 10:43
?**/
@Data
public class LkWeChatBusinessLicenseInfo implements Serializable {
? ? private static final long serialVersionUID = 1582941630439552458L;
? ? private String businessLicenseCopy;
? ? private String businessLicenseNumber;
? ? private String merchantName;
? ? private String legalPerson;
? ? private String companyAddress;
? ? private String businessTime;
? ? public LkWeChatBusinessLicenseInfo(){
? ? ? ? this.businessLicenseCopy = "1";
? ? ? ? this.businessLicenseNumber = "2";
? ? ? ? this.merchantName = "3";
? ? ? ? this.legalPerson = "4";
? ? ? ? this.companyAddress = "5";
? ? ? ? this.businessTime = "6";
? ? }
}2.將實體轉(zhuǎn)換為json字符串,看看未轉(zhuǎn)換前的效果
System.out.println(JSONObject.toJSONString(new LkWeChatBusinessLicenseInfo()));
{
"businessLicenseCopy":"1",
"businessLicenseNumber":"2",
"businessTime":"6",
"companyAddress":"5",
"legalPerson":"4",
"merchantName":"3"
}
3.我們要轉(zhuǎn)換為帶下劃線的key,例如把businessLicenseCopy轉(zhuǎn)換為business_license_copy
我們需要修改實體,加上注解@JSONField
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.io.Serializable;
?
/**
?* @類名 WeChatBusinessLicenseInfo
?* @描述 營業(yè)執(zhí)照/登記證書信息(測試用)
?* @版本 1.0
?* @創(chuàng)建人 XuKang
?* @創(chuàng)建時間 2021/12/24 10:43
?**/
@Data
public class LkWeChatBusinessLicenseInfo implements Serializable {
? ? private static final long serialVersionUID = 1582941630439552458L;
? ? @JSONField(name = "business_license_copy")
? ? private String businessLicenseCopy;
?
? ? @JSONField(name = "business_license_number")
? ? private String businessLicenseNumber;
?
? ? @JSONField(name = "merchant_name")
? ? private String merchantName;
?
? ? @JSONField(name = "legal_person")
? ? private String legalPerson;
?
? ? @JSONField(name = "company_address")
? ? private String companyAddress;
?
? ? @JSONField(name = "business_time")
? ? private String businessTime;
?
? ? public LkWeChatBusinessLicenseInfo(){
? ? ? ? this.businessLicenseCopy = "1";
? ? ? ? this.businessLicenseNumber = "2";
? ? ? ? this.merchantName = "3";
? ? ? ? this.legalPerson = "4";
? ? ? ? this.companyAddress = "5";
? ? ? ? this.businessTime = "6";
? ? }
}4.加上注解后打印轉(zhuǎn)換后的json
System.out.println(JSONObject.toJSONString(new LkWeChatBusinessLicenseInfo()));
{
"business_license_copy":"1",
"business_license_number":"2",
"business_time":"6",
"company_address":"5",
"legal_person":"4",
"merchant_name":"3"
}
三、字段排序
1.我們輸出打印的json是這樣的
{
"business_license_copy":"1",
"business_license_number":"2",
"business_time":"6",
"company_address":"5",
"legal_person":"4",
"merchant_name":"3"
}
我們想按照一定的順序重新排序key
2.在@JSONField注解加上排序ordinal
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.io.Serializable;
?
/**
?* @類名 WeChatBusinessLicenseInfo
?* @描述 營業(yè)執(zhí)照/登記證書信息(測試用)
?* @版本 1.0
?* @創(chuàng)建人 XuKang
?* @創(chuàng)建時間 2021/12/24 10:43
?**/
@Data
public class LkWeChatBusinessLicenseInfo implements Serializable {
?
? ? private static final long serialVersionUID = 1582941630439552458L;
?
? ? @JSONField(name = "business_license_copy",ordinal = 1)
? ? private String businessLicenseCopy;
?
? ? @JSONField(name = "business_license_number",ordinal = 2)
? ? private String businessLicenseNumber;
?
? ? @JSONField(name = "merchant_name",ordinal = 3)
? ? private String merchantName;
?
? ? @JSONField(name = "legal_person",ordinal = 4)
? ? private String legalPerson;
?
? ? @JSONField(name = "company_address",ordinal = 5)
? ? private String companyAddress;
?
? ? @JSONField(name = "business_time",ordinal = 6)
? ? private String businessTime;
?
? ? public LkWeChatBusinessLicenseInfo(){
? ? ? ? this.businessLicenseCopy = "1";
? ? ? ? this.businessLicenseNumber = "2";
? ? ? ? this.merchantName = "3";
? ? ? ? this.legalPerson = "4";
? ? ? ? this.companyAddress = "5";
? ? ? ? this.businessTime = "6";
? ? }
}3.輸出打印轉(zhuǎn)換后的實體:
System.out.println(JSONObject.toJSONString(new LkWeChatBusinessLicenseInfo()));
{
"business_license_copy":"1",
"business_license_number":"2",
"merchant_name":"3",
"legal_person":"4",
"company_address":"5",
"business_time":"6"
}
小結(jié):重命名除@JSONField,還有@JsonProperty、@SerializedName;@JsonProperty主要用于入?yún)⑥D(zhuǎn)換,和Json字符串序列化為Java對象;@SerializedName 改變了默認(rèn)序列化和默認(rèn)反序列化的字段取值;
@JSONField注解常用的使用場景
應(yīng)用場景:
當(dāng)我們在與前端進行交互時,前端想要的字段與我們提供的字段名不同,這時候一種解決方案是修改實體類,但如果該實體類應(yīng)用的比較多,那改起來的代價太大,因此,可以使用注解@JSONField來實現(xiàn)替換效果,用法如下:
@JSONField(name = "size_new") private int size;
一、JSON內(nèi)容與實體類,@JSONField常規(guī)寫法
JSON(與下述JSON字符串內(nèi)容一致)
{
size: 5,
weight: 10,
colour: "red"
}實體類(AppleDO.java)
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
public class AppleDO {
@JSONField(name = "size_new")
private int size;
@JSONField(name = "weight_new")
private int weight;
@JSONField(name = "colour_new")
private String colour;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public String getColour() {
return colour;
}
public void setColour(String colour) {
this.colour = colour;
}
}
二、JSON字符串轉(zhuǎn)對應(yīng)Java對象
執(zhí)行代碼
public static void main(String[] args) {
String json = "{\n" +
" size_new: 5,\n" +
" weight_new: 10,\n" +
" colour_new: \"red\",\n" +
"}";
AppleDO appleDO = JSON.parseObject(json, AppleDO.class);
System.out.println(appleDO.getSize());
System.out.println(appleDO.getWeight());
System.out.println(appleDO.getColour());
}運行結(jié)果

三、支持序列化和反序列化
源碼中的序列化和反序列化默認(rèn)值均為true,則默認(rèn)情況下是允許該字段序列化和反序列化的,如下:
boolean serialize() default true; boolean deserialize() default true;
使用方法(以下不支持序列化,支持反序列化)
@JSONField(name = "size_new", serialize = false, deserialize = true) private int size;
當(dāng)我們的某些字段為空值時,我們?nèi)韵M麑⒋俗侄畏祷氐角岸耍ㄔ撆渲每梢苑祷貛в锌兆侄蔚淖址?,但是?dāng)字段為基本數(shù)據(jù)類型時無效,須將其轉(zhuǎn)換為包裝類)
@JSONField(serialzeFeatures= SerializerFeature.WriteMapNullValue)
四、指定字段順序
將Java對象轉(zhuǎn)換為JSON格式,轉(zhuǎn)換后的字段順序會根據(jù)首字母來排序,亦可通過如下方式來指定字段順序:
@JSONField(name = "size_new", ordinal = 3) private int size; @JSONField(name = "weight_new", ordinal = 1) private int weight; @JSONField(name = "colour_new", ordinal = 2) private String colour;
執(zhí)行代碼
AppleDO apple = new AppleDO();
apple.setSize(6);
apple.setWeight(12);
apple.setColour("green");
String appleStr = JSON.toJSONString(apple);
System.out.println(appleStr);
加ordinal參數(shù)之前運行結(jié)果

加ordinal參數(shù)之后運行結(jié)果

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java源碼解析阻塞隊列ArrayBlockingQueue功能簡介
今天小編就為大家分享一篇關(guān)于Java源碼解析阻塞隊列ArrayBlockingQueue功能簡介,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
SpringBoot使用Prometheus實現(xiàn)監(jiān)控
在當(dāng)今的軟件開發(fā)世界中,監(jiān)控是至關(guān)重要的一部分,本文主要介紹了如何在Spring Boot應(yīng)用程序中使用Prometheus進行監(jiān)控,以幫助大家更好地理解和管理您的應(yīng)用程序,有需要的可以參考下2023-10-10
Java中如何將符號分隔的文本文件txt轉(zhuǎn)換為excel
這篇文章主要介紹了Java中如何將符號分隔的文本文件txt轉(zhuǎn)換為excel,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
ByteArrayOutputStream與InputStream互相轉(zhuǎn)換方式
這篇文章主要介紹了ByteArrayOutputStream與InputStream互相轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot2零基礎(chǔ)到精通之映射與常用注解請求處理
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)映射、常用注解和方法參數(shù)的小技巧2022-03-03
springboot應(yīng)用訪問zookeeper的流程
這篇文章主要介紹了springboot應(yīng)用訪問zookeeper的流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01

