如何使用@ JacksonInject和@ JsonAlias的注释,很多新手都不清楚。为了帮助大家解决这个问题,下面小编就详细讲解一下。需要的人可以从中学习,希望你能有所收获。
让我们继续介绍如何在JSON反序列化中使用@ JacksonInject注释和@ JsonAlias注释。
00-1010当使用JSON格式进行反序列化时,我们经常会有这样的需求。我们从客户端或其他渠道获得了一个JSON数据对象,它包含几个属性。但是当我们反序列化JSON字符串时,我们需要向其中添加一些默认数据,例如:
响应数据的响应时间可以指定为当前时间;
数据反序列化的操作符,分配给系统的当前用户等。
客户端本身返回的数据不会携带这些附加信息。此时,我们可以使用JacksonInject注释在JSON字符串反序列化为对象时添加这些附加信息。下面是如何使用JacksonInject。
[@ Data](https://my . oschina . net/dif rik)
publicclassPlayerStar{
privateStringname
privateIntegerage
privateString[]爱好;//爱好,数组
privatestiststringfriends;//朋友
privateMapString,BigDecimalsalary//年收入地图
@ Jackson inject(' response time ')//注意这里
privatelocatatetimeresponsettime;
}让我们测试反序列化的过程。需要注意的是,下面的jsonInString没有携带responseTime信息,但是我们在反序列化过程中将它注入到了java对象中。
[@ Test](https://my . oschina . net/azi bug)
void testjs 2 object()throwsioxexception {
//为响应时间分配当前值。
可注入值。Stdiv=newInjectableValues。STD();
iv.addValue('responseTime ',local datetime . now());
ObjectMappermapper=new objectmapper();
mapper . setinjectablevalues(iv);//在反序列化过程中,为对象分配一个可插入的值。
//将JSON字符串反序列化为java对象
stringjsoninstringing=' { \ ' name ' : ' Jordan \ ',\ ' age \ ' 336045,\ ' affairs ' 3360[\ ' golf \ ',\ '棒球\ ']} ';
players tarjordan=mapper . readvalue(jsonInString,players tar . class);
System.out.println(约旦);
}最终的反序列化结果,java对象的toString()方法的输出结果如下。您可以看到还有一个额外的responseTime赋值属性,其值是当前时间。
球员(姓名=乔丹,年龄=45,爱好=[高尔夫,棒球],朋友=null,工资=null,
nbsp;responseTime=2020-09-22T06:41:09.192)
二、按照数据类型type进行数据注入
在上文的代码中,JSON字符串反序列化为对象,使用的是属性id的方法进行注入的
@JacksonInject("responseTime") //注意这里responseTime为属性id private LocalDateTime responseTime;
InjectableValues.Std iv = new InjectableValues.Std(); iv.addValue("responseTime", LocalDateTime.now()); //注意这里responseTime为属性id,而这要统一
除了可以按照属性id进行数据的注入,还可以使用java type数据类型进行数据注入。这种方法在一个java 类中,多个成员变量数据类型重复的时候,比如定义多个LocalDateTime成员变量,用起来就不太方便了。所以还是建议大家使用属性id的方法进行注入数据注入。
@JacksonInject private LocalDateTime responseTime;
InjectableValues.Std iv = new InjectableValues.Std(); iv.addValue(LocalDateTime.class, LocalDateTime.now()); //注意这里LocalDateTime.class
三、 @JsonAlias
注解
当我们在开发过程中,可能在v1.0的版本中我们定义的PlayerStar类(上文)包含name属性,但是我们用着用着发现name这个单词太通用了,在很多的地方都是系统关键字;我们希望在v2.0版本中,给这个成员变量换一个名字,叫做starName,或者playerName。但是我们不希望用户废弃v1.0的接口。 也就是说我们希望做到多版本兼容,客户端传送过来的JSON字符串,可以是name、可以是playerName、可以是starName。我们该怎么做?答案是使用@JsonAlias
注解
@Data public class PlayerStar { @JsonAlias({"starName", "playerName" }) private String name;
下面三种JSON格式数据都可以被正确的反序列化为PlayerStar对象,并为name成员变量赋值
String jsonInString = "{\"name\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}"; String jsonInString = "{\"starName\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}"; String jsonInString = "{\"playerName\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/144633.html