[TOC]
# 导包
Jackson包含一个core JAR,和两个依赖core JAR的JAR:
* Jackson Core
* Jackson Annotations
* Jackson Databind
其中Jackson Annotations依赖Jackson Core,Jackson Databind依赖Jackson Annotations。
~~~
com.fasterxml.jackson.core
jackson-databind
2.10.0
com.fasterxml.jackson.core
jackson-annotations
2.10.0
com.fasterxml.jackson.core
jackson-core
2.10.0
~~~
# 简介
Jackson提供了两种不同的JSON解析器:
1. ObjectMapper:把JSON解析到自定义的Java类中,或者解析到一个Jackson指定的树形结构中(Tree model)。
2. Jackson JsonParser:一种“拉式”(pull)解析器,每次解析一组JSON数据。
Jackson也包含了两种不同的JSON生成器
# Jackson配置
在调用 writeValue 或调用 readValue 方法之前,往往需要设置 ObjectMapper 的相关配置信息。这些配置信息应用 java 对象的所有属性上。示例如下:
~~~
//在反序列化时忽略在 json 中存在但 Java 对象不存在的属性
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
false);
//在序列化时日期格式默认为 yyyy-MM-dd'T'HH:mm:ss.SSSZ ,比如如果一个类中有private Date date;这种日期属性,序列化后为:{"date" : 1413800730456},若不为true,则为{"date" : "2014-10-20T10:26:06.604+0000"}
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
//在序列化时忽略值为 null 的属性
mapper.setSerializationInclusion(Include.NON_NULL);
//忽略值为默认值的属性
mapper.setDefaultPropertyInclusion(Include.NON_DEFAULT);
// 美化输出
mapper.enable(SerializationFeature.INDENT_OUTPUT);
// 允许序列化空的POJO类
// (否则会抛出异常)
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
// 把java.util.Date, Calendar输出为数字(时间戳)
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// 在遇到未知属性的时候不抛出异常
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 强制JSON 空字符串("")转换为null对象值:
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
// 在JSON中允许C/C++ 样式的注释(非标准,默认禁用)
mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
// 允许没有引号的字段名(非标准)
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
// 允许单引号(非标准)
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
// 强制转义非ASCII字符
mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
// 将内容包裹为一个JSON属性,属性名由@JsonRootName注解指定
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
//序列化枚举是以toString()来输出,默认false,即默认以name()来输出
mapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING,true);
//序列化Map时对key进行排序操作,默认false
mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS,true);
//序列化char[]时以json数组输出,默认false
mapper.configure(SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS,true);
//序列化BigDecimal时之间输出原始数字还是科学计数,默认false,即是否以toPlainString()科学计数方式来输出
mapper.configure(SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS,true);
~~~
# java转json
ObjectMapper提供了三种方法转换
~~~
writeValue()
writeValueAsString()
writeValueAsBytes()
~~~
~~~
//创建JackSon的核心对象, ObjectMapper
ObjectMapper mapper = new ObjectMapper();
/**
* 转换方法
* writeValue(参数1, obj):
* 参数1:
* File: 将obj对象转换为json字符串,并保存到指定的文件中
* Writer: 将obj对象转换为json字符串,并将json数据填充到字符输出流中
* OutputStream: 将obj对象转换为json字符串,并将json数据填充到字节输出流中
*
* writeValueAsString(obj): 将对象转为json字符串
*/
String s = mapper.writeValueAsString(person);
System.out.println(s); //{"name":"xjd","id":1,"birthday":1571416610414}
//把json写入到文件
<