Jackson 概要学习笔记

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"
//   {
// }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值