博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Json序列化 与 反序列话 中的一些常用注解:@JsonIgnore和@JSONField、@JsonIgnoreProperties
阅读量:2256 次
发布时间:2019-05-09

本文共 4671 字,大约阅读时间需要 15 分钟。

今天工作时遇到一个场景,客户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配置文件:    
....

可以看到customerID与我们数据库中的字段customerId、javaBean字段customerId 不一致,这只是报文协议的冰山一角,需要通过相关手段让customerID的值“绑定”到customerId上。

这时候就需要@JSONField注解,它可以作用在成员属性上或者在方法上。下面通过实例验证一下如何使用。

1、首先是配置在成员属性上

我的实体类分为Query和Domain,本质差别不大,只是Query用于接收参数,domain用于数据库交互的映射。

Queryimport 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;.....Domainpublic 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;@JsonIgnoreprivate int age;}

@JsonIgnoreProperties类注解,作用和@JsonIgnore一样

import com.fasterxml.jackson.annotation.JsonIgnore;@JsonIgnoreProperties({“age”})public class user {private String name;private int age;}

测试就免了哦

转载地址:http://sgrdb.baihongyu.com/

你可能感兴趣的文章
为什么在C#中捕获并抛出异常?
查看>>
宇宙射线:它们对程序产生影响的概率是多少?
查看>>
如何找到foreach索引
查看>>
Android:展开/折叠动画
查看>>
在C#中合并字典
查看>>
处理多个Python版本和PIP?
查看>>
反转Java中的字符串
查看>>
如何将java.util.Date转换为java.sql.Date?
查看>>
如何在Markdown中链接到同一文档的一部分?
查看>>
如何将C#nullable int转换为int
查看>>
如何有条件地向React组件添加属性?
查看>>
如何使用LocalBroadcastManager?
查看>>
“ static”关键字在课程中做什么?
查看>>
为什么链接库的顺序有时会导致GCC错误?
查看>>
Java Hashmap:如何从价值中获取关键?
查看>>
有没有简单优雅的方法来定义单例? [重复]
查看>>
使用带有用户名和密码的cURL?
查看>>
Machine.Config在哪里?
查看>>
ElasticSearch,Sphinx,Lucene,Solr,Xapian。哪种适合哪种用途? [关闭]
查看>>
滚动时背景ListView变为黑色
查看>>