Jsckson 是一个支持解析json和xml数据格式的java类库,简单易用(相对来说),性能较高。是目前流行的JSON处理框架之一,今天就让我们来对jackson进行一个快速的入门和深入的了解。
Maven依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.3</version>
</dependency>
注意: SpringBoot的spring-boot-starter-web包默认引入了jackson的包,可以直接上手! 无需重复引包,可以避免重复引包导致的jar包冲突!
1、序列化(将Java对象转成JSON格式的字符串)
// 创建ObjectMapper对象(jackson所有的操作都是基于ObjectMapper对象来进行的)
ObjectMapper objectMapper = new ObjectMapper();
// 创建一个ObjectNode对象 PS:等同于fastjson中的JSONObject,数据结构等同于java的Map
ObjectNode jsonObj = objectMapper.createObjectNode();
// 往jsonObject对象中put值
jsonObj.put("name", "xiaoming");
jsonObj.put("age", "18");
// 创建一个ArrayNode对象 PS:等同于fastjson中的JSONArray,数据结构等同于java的ArrayList
ArrayNode jsonArr = objectMapper.createArrayNode();
// 往jsonArr里新增一个对象
jsonArr.add(jsonObj);
// 将ObjectNode和ArrayNode对象转出字符串
System.out.println(objectMapper.writeValueAsString(jsonObj));
System.out.println(objectMapper.writeValueAsString(jsonArr));
打印结果:
{"name":"xiaoming","age":"18"}
[{"name":"xiaoming","age":"18"}]
总结: jackson常用的处理对象有两个,分别是ObjectNode和ArrayNode对象,对应fastjson中的JSONObject和JSONArray对象,在日常工作中,我们也都是依据这两个对象来对数据进行操作。
2、反序列化(将JSON格式字符串转成java对象)
String jsonString = objectMapper.writeValueAsString(jsonObj);
String jsonArrString = objectMapper.writeValueAsString(jsonArr);
// json转Map
Map<String ,Object> map = objectMapper.readValue(jsonString, Map.class);
// json转List
ArrayList arrayList = objectMapper.readValue(jsonArrString, ArrayList.class);
//json转map<String,Object>
JavaType jvt = objectMapper.getTypeFactory().constructParametricType(HashMap.class,String.class,Object.class);
Map<String,Object> jvtMap = objectMapper.readValue(jsonString, jvt);
//json转list<Map<String, Object>>
JavaType jt = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, Map.class);
List<Map<String, Object>> jvtList = objectMapper.readValue(jsonArrString, jt);
打印:
{name=xiaoming, age=18}
[{name=xiaoming, age=18}]
{name=xiaoming, age=18}
[{name=xiaoming, age=18}]
3、获取数据
// 获取JsonNode对象
jsonObj.get("name");
// 获取JsonNode对象后转为String(有空指针风险)
jsonObj.get("Val").asText();
// 获取JsonNode对象后转为Boolean(有空指针风险)
jsonObj.get("Val").asBoolean();
// 获取JsonNode对象后转为Double(有空指针风险)
jsonObj.get("Val").asDouble();
// 获取JsonNode对象后转为Int(有空指针风险)
jsonObj.get("Val").asInt();
// 获取JsonNode对象后转为Long(有空指针风险)
jsonObj.get("Val").asLong();