Json序列化 與 反序列話 中的一些常用註解:@JsonIgnore和@JSONField、@JsonIgnoreProperties

今天工作時遇到一個場景,客戶A跟我們進行restful + json數據交互,我們(B,充當中間層的一個角色)將數據存儲,並將獲取的數據直接與客戶C進行restful交互,裏面涉及到一些javaBean屬性的大小寫映射以及某些字段的忽略,現在對相關的註解進行一些說明。

客戶A提供的數據格式如下:

{
 "workOrderNo": "0205258",
 "workOrderType": "",
 "servOperType": "create",
 "customerID": "bbb1",
 "customerName": "xxx",
 "customerAddress": "xxx",
 "orderNumber": "aaa",
 "orderType": "",
 "businessType": "sijfniods"
 }

我們的數據庫設計:

JavaBean:

    /** 主鍵 */
	private Long ywCommonInfoId;
	/** 工單編碼 */
	private String workOrderNo;
	/** 工單類型 */
	private String workOrderType;
	/** 操作類型 */
	private String servOperType;
	/** 客戶ID */
	private String customerId;
	/** 客戶名稱 */
	private String customerName;
	/** 客戶地址 */
	private String customerAddress;
	/** 訂單號碼 */
	private String orderNumber;
	/** 訂單類型 */
    
    ...................


數據庫:

    CREATE TABLE `T_YW_COMMON_INFO` (
  `YW_COMMON_INFO_ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `WORK_ORDER_NO` varchar(255) DEFAULT NULL COMMENT '工單編碼',
  `WORK_ORDER_TYPE` varchar(255) DEFAULT NULL COMMENT '工單類型',
  `SERV_OPER_TYPE` varchar(255) DEFAULT NULL COMMENT '操作類型',
  `CUSTOMER_ID` varchar(255) DEFAULT NULL COMMENT '客戶ID',
  `CUSTOMER_NAME` varchar(255) DEFAULT NULL COMMENT '客戶名稱',
  `CUSTOMER_ADDRESS` varchar(255) DEFAULT NULL COMMENT '客戶地址',
  `ORDER_NUMBER` varchar(255) DEFAULT NULL COMMENT '訂單號碼',
  `ORDER_TYPE` varchar(255) DEFAULT NULL COMMENT '訂單類型',
....

mybatis的xml配置文件:

    <resultMap id="TywCommonInfo" type="com.ky.rest.yw.model.domain.TywCommonInfo">
		<result property="ywCommonInfoId" column="YW_COMMON_INFO_ID" />
		<result property="workOrderNo" column="WORK_ORDER_NO" />
		<result property="workOrderType" column="WORK_ORDER_TYPE" />
		<result property="servOperType" column="SERV_OPER_TYPE" />
		<result property="customerId" column="CUSTOMER_ID" />
		<result property="customerName" column="CUSTOMER_NAME" />
		<result property="customerAddress" column="CUSTOMER_ADDRESS" />
		<result property="orderNumber" column="ORDER_NUMBER" />
		<result property="orderType" column="ORDER_TYPE" />
		<result property="businessType" column="BUSINESS_TYPE" />
....

可以看到customerID與我們數據庫中的字段customerId、javaBean字段customerId 不一致,這只是報文協議的冰山一角,需要通過相關手段讓customerID的值“綁定”到customerId上。

這時候就需要@JSONField註解,它可以作用在成員屬性上或者在方法上。下面通過實例驗證一下如何使用。

1、首先是配置在成員屬性上

我的實體類分爲Query和Domain,本質差別不大,只是Query用於接收參數,domain用於數據庫交互的映射。

Query

import com.alibaba.fastjson.annotation.JSONField;
public class TywCommonInfoQuery extends BaseQuery implements Serializable{

private static final long serialVersionUID = 7330604473414315543L;
	/** 主鍵 */
	private Long ywCommonInfoId;
	/** 工單編碼 */
	private String workOrderNo;
	/** 工單類型 */
	private String workOrderType;
	/** 操作類型 */
	private String servOperType;
	/** 客戶ID */

	@JSONField(name = "customerID")
	private String customerId;

	/** 客戶名稱 */
	private String customerName;

.....

Domain
public class TywCommonInfo extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 主鍵       db_column: YW_COMMON_INFO_ID 
     */	
	private Long ywCommonInfoId;
    /**
     * 工單編碼       db_column: WORK_ORDER_NO 
     */	
	private String workOrderNo;
    /**
     * 工單類型       db_column: WORK_ORDER_TYPE 
     */	
	private String workOrderType;
    /**
     * 操作類型       db_column: SERV_OPER_TYPE 
     */	
	private String servOperType;
    /**
     * 客戶ID       db_column: CUSTOMER_ID 
     */	
	@JSONField(name = "customerID")
	private String customerId;
    /**
     * 客戶名稱       db_column: CUSTOMER_NAME 
     */	
	private String customerName;
    /**
     * 客戶地址       db_column: CUSTOMER_ADDRESS 
     */	
	private String customerAddress;
    /**
     * 訂單號碼       db_column: ORDER_NUMBER 
     */	
	private String orderNumber;
    /**
     * 訂單類型       db_column: ORDER_TYPE 

......

如果你以爲這樣就完事了,那就入坑了,需要對get/set方法重新書寫:

.....



	public String getCustomerID() {
		return customerId;
	}

	public void setCustomerID(String customerId) {
		this.customerId = customerId;
	}


.......

看到了吧,getCustomerID 而不是 getCustomerId!set方法也是一樣的。

上一段測試代碼

@ResponseBody
	@PostMapping("/create")
	public Response create(HttpServletRequest req, @RequestBody TywCommonInfoQuery query) {
		TywCommonInfo t = null;
		try {
			t = new TywCommonInfo(); 
			BeanUtils.copyProperties(t, query);
			t.setCreateTime(new Date());
			tywCommonInfoService.save(t);
			
			LOG.info("__" + query.toString());
		} catch (Exception e) {
			LOG.error("",e);
		}
		return Response.success(SUCCESS, "", t);
	}

利用postman測試工具,查看結果

可以看到"customerID"的值被 TywCommonInfoQuery 的 customerId的屬性獲取了,同時通過 beanutils工具類把值傳給了TywCommonInfo的customerId。因爲postman返回的是TywCommonInfo,不是TywCommonInfoQuery。而且,響應返回的是customerID,是大寫的。

再來看數據庫,可以看到CUSTOMER_ID是有字段值的,第一行null是沒用註解插入的,所以是null。

2、註解在成員方法上面

@JSONField(name = "customerID")
	public String getCustomerID() {
		return customerId;
	}

	@JSONField(name = "customerID")
	public void setCustomerID(String customerId) {
		this.customerId = customerId;
	}

還是得注意是getCustomerID不是getCustomerI。其餘不變,測試就免了,親測可用。

@JsonIgnore和@JsonIgnoreProperties

@JsonIgnore此註解用於屬性或者方法上,常用在屬性上,作用是json序列化時將Java bean中的一些屬性忽略掉,序列化和反序列化都受影響。

例如生成Json時不需要age屬性

import com.fasterxml.jackson.annotation.JsonIgnore;

public class user {
private String name;
@JsonIgnore
private int age;
}

@JsonIgnoreProperties類註解,作用和@JsonIgnore一樣

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnoreProperties({“age”})
public class user {
private String name;
private int age;
}

測試就免了哦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章