Jackson提供了多种利用java创建和读取json的方法。可以将java对象序列化成为json字符串,同样可以将json反序列化为java对象。目前,Jackson的转换已经不仅限于json格式。
java创建json的三种方式:
1.利用java对象序列化为json数据;
2.通过读取原有的json节点,生成新的json字符串;
3.建立一个json流。
解析json的三种方式:
1.json流解析,利用JsonParser解析json流,用JsonGenerator实现反序列化。
2.json树的遍历,通过遍历树的节点来获取相应的属性值。
3.数据绑定,jackson提供了很大的灵活性来绑定json与java类,也可以通过注解来进行绑定属性或构造器。
(流模型为最底层模型,树模型和绑定模型都基于流模型实现。)
Jackson的特性:
1.支持列表序列化;
2.支持注解和动态bean;
3.支持注解过滤器,当java类被json绑定可以实现忽略类中的部分属性(通过注解忽略或者通过自定义过滤器都可以实现)。
4.支持混合注解,解决第三方架构中的类的注解问题。
5.支持多态行为,当json绑定了抽象类,则Jackson会帮他生成一个具体的子类。
Jackson是基于maven的框架,所以需要在pom中定义组件。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
</dependency>
当使用注解时,还需要引入注解组件:
<dependency>
<!-- note: typically only ".0" patch version exists for core annotations -->
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.1</version>
</dependency>
案例(json绑定):
被绑定实体类MyValue,
// Note: can use getters/setters as well; here we just use public fields directly:
public class MyValue {
public String name;
public int age;
// NOTE: if using getters/setters, can keep fields `protected` or `private`
}
com.fasterxml.jackson.databind.ObjectMapper获取初始化对象:
ObjectMapper mapper = new ObjectMapper(); // create once, reuse
将json数据反序列化为java对象,
MyValue value = mapper.readValue(new File("data.json"), MyValue.class);
// or:
value = mapper.readValue(new URL("http://some.com/api/entry.json"), MyValue.class);
// or:
value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class);
将java对象序列化为json字符串,
mapper.writeValue(new File("result.json"), myResultObject);
// or:
byte[] jsonBytes = mapper.writeValueAsBytes(myResultObject);
// or:
String jsonString = mapper.writeValueAsString(myResultObject);
案例(集合的json绑定与解析):
Map<String, Integer> scoreByName = mapper.readValue(jsonSource, Map.class);
List<String> names = mapper.readValue(jsonSource, List.class);
// and can obviously write out as well
mapper.writeValue(new File("names.json"), names);
Map<String, ResultValue> results = mapper.readValue(jsonSource,
new TypeReference<Map<String, ResultValue>>() { } );
// why extra work? Java Type Erasure will prevent type detection otherwise
案例(树模型):
在动态结构中或者绑定不完全的情况下,树模型比json绑定更简便。
// can be read as generic JsonNode, if it can be Object or Array; or,
// if known to be Object, as ObjectNode, if array, ArrayNode etc:
ObjectNode root = mapper.readTree("stuff.json");
String name = root.get("name").asText();
int age = root.get("age").asInt();
// can modify as well: this adds child Object as property 'other', set property 'type'
root.with("other").put("type", "student");
String json = mapper.writeValueAsString(root);
// with above, we end up with something like as 'json' String:
// {
// "name" : "Bob", "age" : 13,
// "other" : {
// "type" : "student"
// {
// }