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;
}

测试就免了哦

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