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 数据之间的序列化和反序列化。
package lucene.file.search.tester; import java.io.IOException;
import java.util.Date;
import java.util.List; import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper; /**
* Jackson从2.0开始改用新的包名fasterxml,1.x版本的包名是codehaus。除了包名不同,他们的Maven artifact id也不同。
* 1.x版本现在只提供bug-fix,而2.x版本还在不断开发和发布中。如果是新项目,建议直接用2x,即fasterxml jackson
* @author Administrator
* jackson-core:核心包
* jackson-annotations:注解包
* jackson-databind:数据绑定包
*/
public class JacksonUtil { private static ObjectMapper objectMapper = new ObjectMapper(); /**
* JSON字符串反序列化成Java对象
* @param json
* @return
*/
public static UserEntity 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();
}
return user;
} /**
* Java对象序列化成JSON字符串
* @param user
* @return
*/
public static String 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();
}
return json;
} /**
* Jackson提供了JavaType,用来指明集合类型和泛型
* @param collectonClass
* @param elementClasses
* @return
*/
public static JavaType getCollectionType(Class<?> collectonClass, Class<?>... elementClasses){
return objectMapper.getTypeFactory().constructParametricType(collectonClass, elementClasses);
} /**
* 集合的反序列化
* @param jsonArray
* @return
*/
public static List<UserEntity> databinds(String jsonArray){
JavaType type = getCollectionType(List.class, UserEntity.class);
List<UserEntity> list = null;
try {
list = objectMapper.readValue(jsonArray, type);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
} public static void main(String[] args) throws JsonProcessingException {
//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(new Date());
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<UserEntity> 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 来序列化属于这一组的配置。
观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象。它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称。
Jackson 序列化和反序列化的更多相关文章
- Jackson序列化和反序列化Json数据完整示例
Jackson序列化和反序列化Json数据 Web技术发展的今天,Json和XML已经成为了web数据的事实标准,然而这种格式化的数据手工解析又非常麻烦,软件工程界永远不缺少工具,每当有需求的时候就会 ...
- Jackson序列化和反序列化
1,下载Jackson工具包(jackson-core-2.2.3.jar jackson-annotations-2.2.3.jar jackson-databind-2.2.3.jar ) j ...
- jackson序列化与反序列化的应用实践
jackson序列化与反序列化的应用实践 源码地址: https://github.com/zhouweixin/serializable 1 相关概念 序列化: 把对象转换为字节序列的过程称为对象的 ...
- MessagePack Java Jackson 序列化和反序列化 POJO 为 MessagePack 的数组类型用来与 msgpack-java:0.6 保持兼容性
在 msgpack-java 0.6 或者早期的版本中,POJO 在 MessagePack 中被序列化和反序列化为数组变量. 变量的顺序是基于 Java 类中变量的内部顺序了,这种本来是一种原生的序 ...
- Gson、jackson 序列化,反序列化(单个、集合)
实体类: package com.nf.redisDemo1.entity; public class News { private long id; private String title; pr ...
- 第一章 JacksonUtil 序列化与反序列化属性总结
1.json-lib与Jackson 关于json-lib与Jackson对比总结如下: 1).性能方面,Jackson的处理能力高出Json-lib10倍左右. 2).json-lib已经停止更新, ...
- SpringBoot系列——Jackson序列化
前言 Spring Boot提供了与三个JSON映射库的集成: Gson Jackson JSON-B Jackson是首选的默认库. 官网介绍: https://docs.spring.io/spr ...
- Jackson对泛型的序列化和反序列化方法汇总
说明:Jackson对于简单泛型是可以正常操作的,但是如果对于太过于复杂的泛型类有时会不成功.目前还在找着更合适的Json库.不过这一点在dotnet原生方案JavaScriptSerializer可 ...
- Java下用Jackson进行JSON序列化和反序列化(转)
Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...
随机推荐
- CSV Data Set Config 拓展开发
1.目的 在日常的性能测试项目中,经常会遇到参数化的问题,我们所熟知的LR工具对参数化支持非常友好,然而JMeter相对逊色一些.大家都知道在使用JMeter工具参数化时常用CSV Data Set ...
- ReactJS:最大更新深度超出错误
Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside com ...
- 【redis】redis应用场景,缓存的各种问题
如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 缓存 redis还有另外一个重要的应用领域——缓存 引用来自网友的图解释缓存在架构中的位置 默认情况下 ...
- python所有的内置异常类型汇总
内置异常基类 在 Python 中,所有异常必须为一个派生自 BaseException 的类的实例. 通过子类化创建的两个不相关异常类永远是不等效的,既使它们具有相同的名称. 下列异常主要被用作其他 ...
- JavaScript中几种常见的兼容问题及解决方案
在js中好用的东西一般都存在兼容问题,以下,我整理了一些常用的兼容处理方法,自己用的时候可以把他们放在一个JS文件中,需要用到时候直接引入,会比较方便. 一.获取非行内样式 function getS ...
- Python 基础 2-3 列表的反转与排序
引言 列表是按照特定格式排序而成的,有时候这种排序方式我们并不喜欢,我们希望它可以按照我们的方式来进行正序或者倒序排序,或其他的排序方式 反转与排序 比如说我这里有一组列表,里面存放的全部都是数值,但 ...
- .NET Core 学习资料精选:进阶
.NET 3.0 这个月就要正式发布了,对于前一篇博文<.NET Core 学习资料精选:入门>大家学的可还开心?这是本系列的第二篇文章:进阶篇,喜欢的园友速度学起来啊. 对于还在使用传统 ...
- 创建ASP.NET Webservice
一.WebService:WebService是以独立于平台的方式,通过标准的Web协议,可以由程序访问的应用程序逻辑单元. (1)应用程序逻辑单元:web服务包括一些应用程序逻辑单元或者代码.这些代 ...
- Java连载26-方法(语法结构)
一.方法 1.返回值类型如果不是void,表示这个方法执行结束之后必须返回一个具体的数值,当方法执行结束的时候没有返回任何数值,编译器会报错,怎么返回值呢?并且要求“值”的数据类型必须和“方法的返回值 ...
- Vim高手,从来不用鼠标2——替换、撤销、缩进、查找
本文章原创首发于公众号:编程三分钟 vim 替换.撤销.缩进.查找 上一次我们掌握了移动.跳转.定位.操作(删除.复制.粘贴),基本使用vim脱离鼠标完全是可以做到的了.速记如下: 移动: h,l,j ...