jackson JsonPropertyOrder和@JsonIgnoreProperties注解
有些时候,我们在和外部系统交互的时候使用了json作为标准的数据交换格式,同时为了安全性考虑,增加了对报文的校验,因此我们需要确保序列化的时候参数有序且不多不少刚好,因为对外的API不像后台和前端交互一样,兼容即可,而是对严谨性的要求极高。jackson默认的机制是序列化的时候,先父类的属性,然后再是子类的属性按照定义的顺序进行(fastjson则刚好相反,先序列化子类,然后序列化父类)。为了使用json的工具类,且达到有序的目的,之前特地研究了fastjson/jackson两者的序列化特性,fastjson/jackson都有设置序列化顺序的参数,也就是jackson @JsonProperty注解的index以及fastjson @JSONField注解的ordinal。实际设置了测试下来,感觉两者都不生效或者有bug,总之行为比较怪异。之前记得jackson有个类级别的@JsonInclude注解可以设置要序列化的所有属性,于是特地测试了,符合预期的要求,不过记错了是JsonIgnoreProperties。结合继承+@JsonFormat注解,我们甚至可以完美的达到对于一个相同的属性比如状态,有些view要称为orderStatus,另外一些称为shippingStatus的目标,同时确保在service/mapper层,完全是场景无关的。jacksonJsonIgnoreProperties/JsonPropertyOrder在序列化和反序列化时仅读取当前类的注解,忽略父类的注解,这样我们就可以做到行为的100%精确控制,同时尽可能的复用了父类的定义。
如下:
package tf56.lf.lfoms.model.pub; import java.io.Serializable;
import java.util.List; import javax.validation.constraints.NotNull; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyOrder; import lombok.Getter;
import lombok.Setter;
import tf56.lf.base.metadata.validate.ValidServices;
import tf56.lf.common.util.JacksonHelper;
import tf56.lf.lfoms.validate.group.Group; /** * @author admin
*
*/
@Getter
@Setter
@Deprecated
@JsonPropertyOrder({"fromOutPartyType","receiverMobile","sessionBean"})
@JsonIgnoreProperties({"businessPartId","omsPaymentCollectionList","requestOrderNo"})
public class TmsCreateRequestOrderIQReqDTO extends TmsCreateRequestOrderMainReqDTO implements Serializable{ private static final long serialVersionUID = 8617922710046163090L; //费用list
@ValidServices(services = Group.RQUERSTORDER_CREATE )
@NotNull
@JsonFormat
private List<CreateOmsPaymentCollectionReq> omsPaymentCollectionList; //货物列表
@ValidServices(services = Group.RQUERSTORDER_CREATE )
@NotNull
private List<CreateGoodsDOReq> goodsList; public static void main(String[] args) {
TmsCreateRequestOrderIQReqDTO dto = new TmsCreateRequestOrderIQReqDTO();
System.out.println(JacksonHelper.toJSON(dto));
}
}
在TmsCreateRequestOrderMainReqDTO类上设置了:
@JsonPropertyOrder({"sessionBean","fromOutPartyType","receiverMobile"})
@JsonIgnoreProperties({"senderMobile"})
输出如下:
{"fromOutPartyType":null,"receiverMobile":null,"sessionBean":null,"tfSign":null,"senderPartyId":null,"senderName":null,"senderMobile":null,"fromDistrict":null,"fromAddress":null,"senderOrganization":null,"toOutPartyType":null,"receiverPartyId":null,"receiverPartyName":null,"toDistrict":null,"toAddress":null,"receiverOrganization":null,"carriersPartyId":null,"carriersCompany":null,"clientNumber":null,"transportMethod":null,"deliveryMethod":null,"isNeedReceipt":null,"receiptMethod":null,"receiptNum":null,"orderSource":null,"terminal":null,"memo":null,"goodsList":null}
不过总的来说,Jackson应该提供JsonProperties注解,毕竟仅提供ignore,不提供正向的总会有些时候无法直接满足一样,就像黑白名单一样的道理。
不过这只是解决了单项的序列化问题,反序列化的时候,同样需要解决。如果暴露的接口直接通过json requestbody映射进来,就只能定义一个一一对应的接口代理类来映射了。
jackson JsonPropertyOrder和@JsonIgnoreProperties注解的更多相关文章
- @JsonIgnoreProperties注解不起作用的问题解决
最近做的一个东西要调第三方服务接口,要参照接口文档开发,但是第三方服务的接口字段名全部都是大写,本来以为这种应该没有什么问题.但是实际开发中发现大写的字段名字去调后台接口的时候报: org.codeh ...
- jackson基于注解的简单使用
Jackson提供了一系列注解,方便对JSON序列化和反序列化进行控制,下面介绍一些常用的注解. 1.@JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性. 2.@JsonFo ...
- jackson 常用注解,比如忽略某些属性,驼峰和下划线互转
一般情况下使用JSON只使用了java对象与字符串的转换,但是,开发APP时候,我们经常使用实体类来做转换:这样,就需要用到注解: Jackson默认是针对get方法来生成JSON字符串的,可以使用注 ...
- 由@Convert注解引出的jackson对枚举的反序列化规则
对于一些状态字段以前时兴用常量,现在时兴用枚举,虽然阅读体验极佳,但是传值的时候还是会有些麻烦,需要设置一下转换器.比如: class A{ @Convert(converter=TestTypeCo ...
- 【JSON 注解】JSON循环引用1-----Jackson常用注解介绍 eq:@JsonIgnore
循环引用:实体A与实体B有关系,A中有B作为字段,B中有A作为一个字段.查询A对象后,将A对象转化为JSON格式数据时,会因为序列化过程中导致A中有B字段,B字段中又有A,这样就引起了循环引用的问题! ...
- 【maven + hibernate(注解) +spring +springMVC】 使用maven搭建项目
研究,百度,查资料+好友帮助,使用MyEcplise2015工具,通过maven搭建hibernate+springMVC+spring的项目,数据库采用MySql5.5 不过使用的版本会在项目搭建过 ...
- Android 基本 Jackson Marshalling(serialize)/Unmarshalling(deserialize)
本文内容 基本 Jack Marshalling 忽略属性 忽略 Null 字段 改变字段名字 基本 Jackson Marshalling 把 JSON 解析成 JsonNode Unmarshal ...
- Jackson使用手册
引用jar:jackson-core,jackson-databind,jackson-annotations http://central.maven.org/maven2/com/fasterxm ...
- jackson 的UnrecognizedPropertyException错误
阅读更多 前段时间,使用jackson封装了json字符串转换为javabean的方法,代码如下: public static <T> T renderJson2Object(String ...
随机推荐
- maven设置每次构建获取最新版本号
build.gradle中的依赖是通过设置maven依赖实现.我们知道,maven可以说是通过一个坐标定位来确定唯一一个包的,所说的坐标定位分别是groupId,artifactId和version三 ...
- vue打包后404,webpack配置问题
首先声明这是基于vue2.x的 1. 将其中build的配置项assetsPublicPath进行修改,改为上图-->目的是将资源文件的引入路径,改为相对地址(相对index.html) 2.h ...
- spring之文件上传
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- ubuntu 安装/卸载nginx及常用命令
安装命令 sudo apt-get update #更新apt sudo apt-get install nginx #安装nginx 启动/重启/停止命令 一. /etc/init.d/nginx ...
- LeetCode28.实现strStr()
实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...
- 第四章 CSS3概述
1.CSS3新增常用选择器(1)结构性伪类选择器:root 文档根元素 :nth-child(n) 第N个子元素"first-child 第一个元素 :kast-child 最后一个子元素 ...
- efcore从数据库快速生成实体及context
有些项目开发时先建立数据库,再用codefirst来书写entity和EntityConfiguration,比较耗费功夫. 1.在vs2017中新建个asp.net core的web项目,或者其他项 ...
- word论文之图和表目录制作
https://jingyan.baidu.com/article/91f5db1b3c539f1c7e05e341.html?qq-pf-to=pcqq.c2c 1.目标: (1)图目录. (2)表 ...
- 检索系统向量化计算query-doc相似度
def cal_sim2(A,B): ''' A :query [1,2] B: answers [[1,2],[3,5]] ''' need_norm=False A = np.array(A) B ...
- sitecore教程路径分析器
路径分析器是一个应用程序,使您可以创建一个地图,显示联系人在浏览您的网站时所采取的顺序路径.您可以在与广告系列互动时查看联系人所采用的路径,并触发目标和结果. 您可以创建新的路径分析器地图,以跟踪联系 ...