Jackson是基于Java语言的一种JSON和Java对象的数据处理工具。功能上简单易用,性能上根据目前主流转换工具比较,Jackson相对比较高效。

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>

Jackson包含三个jar:

1、jackson-core

  2、jackson-annotations

  3、jackson-databind

从Maven仓库中可知三者的依赖关系:1和2相互独立,3依赖1和2

Jackson的JSON库提供了3种API:

  • Data Binding:最方便,也是最常用方式                    依赖jackson-databind
  • Tree Model:最灵活                                                   依赖jackson-databind
  • Streaming API:性能最好                                          只依赖jackson-core

一、Data Binding

1、序列化

 可使用ObjectMapper.writeValueAsString(Object obj)方法

UserInfo userInfo1 = new UserInfo();
userInfo1.setName("matt");
userInfo1.setAge(21); UserInfo userInfo2 = new UserInfo();
userInfo2.setName("kevin");
userInfo2.setAge(15); List<UserInfo> list = new ArrayList<UserInfo>();
list.add(userInfo1);
list.add(userInfo2); Staff staff = new Staff();
staff.setUsers(list);
staff.setCount(list.size()); ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(staff);
System.out.println(json);
// 输出:{"count":2,"users":[{"name":"matt","age":21},{"name":"kevin","age":15}]}

 可使用注解,实现序列化的细节控制,如  
    @JsonIgnore  忽略属性
 @JsonFormat  日期格式化
 @JsonProperty  属性重命名

2、反序列化

 实体的反序列化

Staff tmpStaff =  new ObjectMapper().readValue(json, Staff.class);  // 实体可包含泛型字段

 泛型的反序列化

List<UserInfo> tmpList = new ObjectMapper().readValue(json, new TypeReference<List<UserInfo>>() {});

 方法参数的反序列化

public class Company {
public void printUsers(List<UserInfo> users) {
for (UserInfo userInfo : users) {
System.out.println(String.format("name:%s, age:%d", userInfo.getName(), userInfo.getAge()));
}
}
}
String json = "[{\"name\":\"matt\",\"age\":21},{\"name\":\"kevin\",\"age\":15}]";
Method method = Company.class.getDeclaredMethods()[0];
Type type = method.getGenericParameterTypes()[0];
method.invoke(new Company(), objectMapper.readValue(json, TypeFactory.defaultInstance().constructType(type)));
// 输出:
// name:matt, age:21
// name:kevin, age:15

 注:使用Method.getGenericParameterTypes()返回Type,其中包含方法定义时参数的泛型信息,因而可正常反序列化

二、Tree Model

1、序列化

 JsonNodeFactory生成树节点,ObjectMapper.writeTree()和JsonGenerator负责输出json字符串

StringWriter sw = new StringWriter();
JsonFactory jsonFactory = new JsonFactory();
JsonGenerator jsonGenerator = jsonFactory.createGenerator(sw); JsonNodeFactory jsonNodeFactory = new JsonNodeFactory(false);
ObjectNode node1 = jsonNodeFactory.objectNode();
node1.put("aa", 89);
node1.put("bb", "abd");
ObjectNode node2 = jsonNodeFactory.objectNode();
node2.put("gr", 9);
node2.set("subnode", node1);
new ObjectMapper().writeTree(jsonGenerator, node2);
System.out.println(sw.toString());
// 输出:{"gr":9,"subnode":{"aa":89,"bb":"abd"}}

2、反序列化

 ObjectMapper.readValue() 可把json字符串解析成JsonNode

String json = "[{\"name\":\"matt\",\"age\":21},{\"name\":\"kevin\",\"age\":15}]";
JsonNode node = new ObjectMapper().readValue(json, JsonNode.class);
JsonNode subNode = node.get(0);
System.out.println(subNode.get("name").asText());

三、Streaming API

1、序列化

 JsonGenerator提供序列化接口

JsonFactory jsonFactory = new JsonFactory();
// JsonFactory jsonFactory = new ObjectMapper().getFactory();
JsonGenerator jsonGenerator = jsonFactory.createGenerator(System.out); jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("name", "matt");
jsonGenerator.writeNumberField("age", 10);
// jsonGenerator.writeObjectField("user", new UserInfo()); // 会抛异常
jsonGenerator.writeEndObject(); jsonGenerator.flush();
jsonGenerator.close();
// 输出: {"name":"matt","age":10}

 序列化实体对象时,会抛异常: java.lang.IllegalStateException: No ObjectCodec defined for the generator, can only serialize simple wrapper types

  解决该问题的方法:使用ObjectMapper.getFactory() 创建JsonFactory 对象

 2、反序列化

 JsonParser提供反序列化功能,其工作方式是:将JSON分成一个Token序列(如START_OBJECT、END_OBJECT、FIELD_NAME等),迭代Token序列进行解析

 JsonParser通过nextToken()获取Token,getCurrentName()获取当前Field Name,getText()或getValueAsString()等获取Value

String json = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
JsonFactory jsonFactory = new JsonFactory();
JsonParser jsonParser = jsonFactory.createParser(json);
jsonParser.nextToken();
while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
String name = jsonParser.getCurrentName();
jsonParser.nextToken();
String value = jsonParser.getText();
System.out.println(String.format("%s: %s", name, value));
}
// 输出:
// brand: Mercedes
// doors: 5

参考:

JSON之Jackson(一)

JSON之Jackson(二)

Jackson基础教程

JSON 解析 (二)—— Jackson的使用的更多相关文章

  1. Json解析工具Jackson(使用注解)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...

  2. Java进阶学习:JSON解析利器JackSon

    Java:JSON解析利器JackSon JackSon基础 1.Maven项目引入 <!-- https://mvnrepository.com/artifact/org.codehaus.j ...

  3. Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解

    Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解 @JsonIgnoreProperties 此注解是类注解,作用是json序列化时将Javabean中的一 ...

  4. Unity的Json解析<二>–写Json文件

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...

  5. json解析之jackson

    对于json格式的数据解析现在越来越多了,之前介绍了两种:fastjson和net.sf.json解析. 今天又有一个jackson解析.不过相对于之前两种,这种感觉稍微笨拙些.呵呵,还是了解下吧: ...

  6. spring boot2 修改默认json解析器Jackson为fastjson

    0.前言 fastjson是阿里出的,尽管近年fasjson爆出过几次严重漏洞,但是平心而论,fastjson的性能的确很有优势,尤其是大数据量时的性能优势,所以fastjson依然是我们的首选:sp ...

  7. Json解析工具Jackson(简单应用)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 概述 Jackson库(http://jackson.codehaus.org),是 ...

  8. json解析之jackson ObjectMapper

    Json解析常用的有fastjson和jackson,性能上网上有不少的对比,说是fastjson比较好,今天先整理一下jackson的东西,后面再发一个fastjson的. jackson是spri ...

  9. 开源工具-Json 解析器 Jackson 的使用

    Json已经成为当前服务器与 WEB 应用之间数据传输的公认标准.Java 中常见的 Json 类库有 Gson.JSON-lib 和 Jackson 等.相比于其他的解析工具,Jackson 简单易 ...

  10. JSON解析工具——Jackson的简单使用

    什么是Jackson 可以轻松实现Java对象与JSON字符串的转换 准备工作:导包 Jackson的jar all下载地址:http://jackson.codehaus.org/1.7.6/jac ...

随机推荐

  1. CSS的插入和选择器介绍

    一.认识CSS样式 1.定义 CSS全称:层叠样式表(Cascading Style Sheets) 主要作用:定义HTML内容在浏览器内的显示样式,比如文字大小.颜色.字体加粗等 优点:通过定义某个 ...

  2. 图解HTTP,TCP,IP,MAC的关系

    入门 用户发了一个HTTP的请求,想要访问我们网站的首页,这个HTTP请求被放在一个TCP报文中,再被放到一个IP数据报中,最终的目的地就是我们的115.39.19.22. 进阶 IP数据报其实是通过 ...

  3. Python从菜鸟到高手(8):print函数、赋值与代码块

    1.神奇的print函数   print函数相信读者一定对它不陌生,因为在前面的章节,几乎每个例子都使用了print函数,这个函数的功能就是在控制台输出文本.不过print在输出文本时还可以进行一些设 ...

  4. 我们都被GitHub出卖了!逃跑吧兄弟!

    周一突然间爆出微软以75亿收购GitHub可真是一颗重磅炸弹,一下轰动整个软件业.如果你不是搞开发的这篇文章几本不会引起你的共鸣:如果你没有用源代码管理这个消息也只不过是个新闻:如果你是微软系的朋友那 ...

  5. 北京教育软件创业公司招 .net工程师

    北京教育软件创业公司,招 .net工程师,月工资2万左右,有合适的朋友帮忙推荐下,要求水平稍高一些的.产品目前用Winform开发的.创始人两个清华,一个北大.老板在美国待了七年回来的,爱人在清华教书 ...

  6. Python_匿名函数_47

    匿名函数 Eva_J 匿名函数:为了解决那些功能很简单的需求而设计的一句话函数 #这段代码 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc ...

  7. lower_bound函数与upper_bound函数

    头文件 : algorithm vector<int>a a中的元素必须升序,用的是二分 lower_bound(a.begin(),a.end(),k) 返回a容器中,最右边的小于等于k ...

  8. (第十三周)评论Final发布II

    按课上展示的顺序对每组进行点评:(性能.功能.UI.部署) 1.  Nice! 项目:约跑软件 软件操作的响应很快,俩人进行聊天时可以实现消息的及时传递.功能主要有:注册账号.登录.创建/删除跑步计划 ...

  9. iOS开发之一句代码检测APP版本的更新

    提示更新效果图如下,当然也是可以自定义类似与AlertView相似的自定义view,如京东.网易云音乐都是自定义了这种提示框的view.以下只展示,从App Store获取到app信息.并解析app信 ...

  10. 有界算子p129

    ? 如果我把这里的1改成2,把1/(a-b) 换成1/2(a-b) 为什么不能是? 2. 这里的x是关于t的函数,为什么x属于 结果了?和x应该没有关系呀? 3. 那为什么T的范数不是一个固定值?为什 ...