jackson 反序列化string_Jackson 序列化和反序列化

一、前言

Jackson 功能很强大,既能满足简单的序列化和反序列化操作,也能实现复杂的、个性化的序列化和反序列化操作。到目前为止,Jackson 的序列化和反序列化性能都非常优秀,已经是国内外大部分 JSON 相关编程的首选工具。

Jackson从 2.0 开始改用新的包名 fasterxml,1.x 版本的包名是 codehaus。除了包名不同,他们的 Maven artifact id 也不同。1.x 版本现在只提供 bug-fix,而 2.x 版本还在不断开发和发布中。如果是新项目,建议直接用 2x,即 fasterxml jackson。

二、Jackson 操作

2.1 ObjectMapper 类

ObjectMapper 类是 Jackson 库的主要类,它能够实现 Java 对象与 JSON 数据之间的序列化和反序列化。

packagelucene.file.search.tester;importjava.io.IOException;importjava.util.Date;importjava.util.List;importcom.fasterxml.jackson.core.JsonGenerationException;importcom.fasterxml.jackson.core.JsonParseException;importcom.fasterxml.jackson.core.JsonProcessingException;importcom.fasterxml.jackson.databind.JavaType;importcom.fasterxml.jackson.databind.JsonMappingException;importcom.fasterxml.jackson.databind.ObjectMapper;/*** Jackson从2.0开始改用新的包名fasterxml,1.x版本的包名是codehaus。除了包名不同,他们的Maven artifact id也不同。

* 1.x版本现在只提供bug-fix,而2.x版本还在不断开发和发布中。如果是新项目,建议直接用2x,即fasterxml jackson

*@authorAdministrator

* jackson-core:核心包

* jackson-annotations:注解包

* jackson-databind:数据绑定包*/

public classJacksonUtil {private static ObjectMapper objectMapper = newObjectMapper();/*** JSON字符串反序列化成Java对象

*@paramjson

*@return

*/

public staticUserEntity databind(String json){

UserEntity user= null;try{

user= objectMapper.readValue(json, UserEntity.class);

}catch(JsonParseException e) {

e.printStackTrace();

}catch(JsonMappingException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}returnuser;

}/*** Java对象序列化成JSON字符串

*@paramuser

*@return

*/

public staticString custom(UserEntity user){

String json= null;try{

json=objectMapper.writeValueAsString(user);

}catch(JsonGenerationException e) {

e.printStackTrace();

}catch(JsonMappingException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}returnjson;

}/*** Jackson提供了JavaType,用来指明集合类型和泛型

*@paramcollectonClass

*@paramelementClasses

*@return

*/

public static JavaType getCollectionType(Class> collectonClass, Class>... elementClasses){returnobjectMapper.getTypeFactory().constructParametricType(collectonClass, elementClasses);

}/*** 集合的反序列化

*@paramjsonArray

*@return

*/

public static Listdatabinds(String jsonArray){

JavaType type= getCollectionType(List.class, UserEntity.class);

List list = null;try{

list=objectMapper.readValue(jsonArray, type);

}catch(JsonParseException e) {

e.printStackTrace();

}catch(JsonMappingException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}returnlist;

}public static void main(String[] args) throwsJsonProcessingException {//JSON字符串反序列化成Java对象

String json = "{\"name\":\"Rain\",\"id\":4405,\"age\":28,\"createDate\":\"2018-01-25 12:17:22\",\"phone\":\"13891701101\"}";

UserEntity user=databind(json);

System.out.println(user.toString());//Java对象序列化成JSON字符串//UserEntity user = new UserEntity();

user.setId(10086L);

user.setName("Bob");

user.setAge(18);

user.setCreateDate(newDate());

System.out.println(custom(user));//集合的反序列化和序列化

String jsonArray = "[{\"name\":\"Rain\",\"id\":4405,\"age\":28,\"createDate\":\"2018-01-25 12:17:22\",\"phone\":\"13891701102\"},"

+ "{\"name\":\"Jim\",\"id\":4406,\"age\":26,\"createDate\":\"2018-01-25 12:17:22\",\"phone\":\"13891701103\"}]";

List userList =databinds(jsonArray);for(UserEntity userEntity : userList) {

System.out.println(userEntity.toString());

}//集合的序列化

System.out.println(objectMapper.writeValueAsString(userList));

}

}

2.2 Jackson 常用注解

Jackson 包含了很多注解,用来个性化序列化和反序列化操作,主要包含如下注解。

@JsonProperty,作用在属性上,用来为 JSON Key 指定一个别名;

@JsonIgnore,作用在属性上,用来忽略此属性;

@JsonIgnoreProperties,忽略一组属性,作用在类上,比如 @JsonIgnorePropertiess({"id","phone"});

@JsonAnySetter,标记在某个方法上,此方法接收 Key、Value,用于 Jackson 在反序列化过程中,未找到的对应属性都调用此方法。通常这个方法用一个 Map 来实现;

@JsonAnyGetter,此注解标注在一个返回 Map 的方法上,Jackson 会取出 Map中的每一个值进行序列化;

@JsonFormat,用于日期的格式化,如:

@JsonFormat(pattern="yyyy-MM-dd HH-mm-ss")private Date createDate;

@JsonNaming,用于指定一个命名策略,作用于类或者属性上,类似 @JsonProperty,但是会自动命名。Jackson 自带了多种命名策略,你也可以实现自己的命名策略,比如输入的 Key 由 Java 命名方式转换为下划线命名方式:userName 转换为 user-name;

@JsonSerialize,指定一个实现类来自定义序列化。类必须实现 JsonSerializer 接口;

@JsonDeserialize,用户自定义反序列化,同 @JsonSerialize,类需要实现 JsonDeserialize 接口;

@JsonView,作用在类或者属性上,用来定义一个序列化组。Spring MVC 的 Controller 方法可以使用同样的 @JsonView 来序列化属于这一组的配置。

观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象。它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值