JSON 解析 (二)—— Jackson的使用
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(使用注解)
原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...
- Java进阶学习:JSON解析利器JackSon
Java:JSON解析利器JackSon JackSon基础 1.Maven项目引入 <!-- https://mvnrepository.com/artifact/org.codehaus.j ...
- Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解
Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解 @JsonIgnoreProperties 此注解是类注解,作用是json序列化时将Javabean中的一 ...
- Unity的Json解析<二>–写Json文件
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...
- json解析之jackson
对于json格式的数据解析现在越来越多了,之前介绍了两种:fastjson和net.sf.json解析. 今天又有一个jackson解析.不过相对于之前两种,这种感觉稍微笨拙些.呵呵,还是了解下吧: ...
- spring boot2 修改默认json解析器Jackson为fastjson
0.前言 fastjson是阿里出的,尽管近年fasjson爆出过几次严重漏洞,但是平心而论,fastjson的性能的确很有优势,尤其是大数据量时的性能优势,所以fastjson依然是我们的首选:sp ...
- Json解析工具Jackson(简单应用)
原文http://blog.csdn.net/nomousewch/article/details/8955796 概述 Jackson库(http://jackson.codehaus.org),是 ...
- json解析之jackson ObjectMapper
Json解析常用的有fastjson和jackson,性能上网上有不少的对比,说是fastjson比较好,今天先整理一下jackson的东西,后面再发一个fastjson的. jackson是spri ...
- 开源工具-Json 解析器 Jackson 的使用
Json已经成为当前服务器与 WEB 应用之间数据传输的公认标准.Java 中常见的 Json 类库有 Gson.JSON-lib 和 Jackson 等.相比于其他的解析工具,Jackson 简单易 ...
- JSON解析工具——Jackson的简单使用
什么是Jackson 可以轻松实现Java对象与JSON字符串的转换 准备工作:导包 Jackson的jar all下载地址:http://jackson.codehaus.org/1.7.6/jac ...
随机推荐
- Asp.net MVC 利用(aspose+pdfobject.js) 实现在线预览word、excel、ppt、pdf文件
在线预览word.excel.ppt利用aspose动态生成html 主要代码 private bool OfficeDocumentToHtml(string sourceDoc, string s ...
- Java和.NET(C#)的开发用到的技术对比总结
前言 声明:我指的是一般的Java和.NET(C#)的后台开发用到的技术总结 最近一直在应聘ing,楼主的项目还是.NET(C#)项目居多,Java项目相对少,在这也吐槽下,招.NET(C#)的公司实 ...
- Jmeter(三十八)while控制器实现ssh三次重连
在jmeter中,可以使用SSH协议连接主机进行相关操作, 步骤如下 首先添加一个ssh command 我们的测试交流群:317765580 在command中填写远程连接的必要信息 结果树中可以 ...
- node express使用
var express = require('express'); var app = express(); app 对象具有以下的方法: 路由HTTP请求:app.METHOD和app.param. ...
- vue内置组件 transition 和 keep-alive 使用
1.transition name - string,用于自动生成 CSS 过渡类名.例如:name: 'fade' 将自动拓展为.fade-enter,.fade-enter-active等.默认类 ...
- Python-生成器_36
#生成器函数 def generator(): print(1) return 'a' ret = generator() print(ret) #只要含有yield关键字的函数都是生成器函数 # y ...
- 1060D Social Circles(贪心)
题意:有n个客人,第i个客人希望左边至少Li个空椅子,右边至少Ri个空椅子,每个客人都属于一个圈,问你最少需要准备的椅子数量 贪心做,每个人都可以去和另一个人牵手,组成一个新的人,那么我们让大的和大的 ...
- c++之sizeof的用法
在此温习一下c语言中sizeof的用法以及c++11.0的标准中,关于初始化的新方式,先上代码: # include "iostream" # include "stri ...
- Hadoop生态的配置
网盘下载地址 链接: https://pan.baidu.com/s/19qWnP6LQ-cHVrvT0o1jTMg 密码: 44hs Hadoop伪分布式配置 Hadoop 可以在单节点上以伪分布 ...
- Ajax中文乱码的解决
网上有很多解决Ajax中文乱码的例子,昨晚弄了很久,最终确定一种“确实”有效地方法.首先我有必要说明一下我遇到的情况:有一个注册页面,注册用户填完信息并提交后,页面获得信息并通过java servle ...