java json 库之 jackson

jackson 是一个 java json 库,提供了完备的 json 解析,序列化以及反序列化功能

依赖配置

在 build.gradle 里面添加依赖配置

compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.4'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.4'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.4'

json 解析

String jsonString = "{\"name\": \"hatlonely\" /* comment */, \"birthday\": \"2018-03-18 15:26:37\", \"mails\": [\"hatlonely@foxmail.com\", \"hatlonely@gmail.com\"]}";

JsonFactory jsonFactory = new JsonFactory();
jsonFactory.enable(Feature.ALLOW_COMMENTS);
ObjectMapper objectMapper = new ObjectMapper(jsonFactory);
JsonNode node = objectMapper.readTree(jsonString);

assertThat(node.path("name").asText(), equalTo("hatlonely"));
assertThat(node.path("birthday").asText(), equalTo("2018-03-18 15:26:37"));
assertThat(node.path("mails").size(), equalTo(2));
assertThat(node.path("mails").path(0).asText(), equalTo("hatlonely@foxmail.com"));
assertThat(node.path("mails").path(1).asText(), equalTo("hatlonely@gmail.com"));

调用 ObjectMapper.readTree 就能讲 json 字符串解析成一个 JsonNode 对象,然后通过 path 方法就可以获取 json 中各个字段的值了,这种方式可以用来读取 json 格式的配置文件,可以用一个 JsonFactory 打开 ALLOW_COMMENTS 特性,可以在 json 里面加入注释

序列化与反序列化

首先定义一个对象

class Person {
    String name;

    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    Date birthday;

    @JsonProperty("mails")
    List<String> emails;

    // 省略了 getter/setter
}

除了支持基本的数据类型,还支持 List 和 Map 类型,甚至还支持 Date 类型,Date 类型默认的格式是 ISO8601 格式,也可以通过 @JsonFormat 指定日期格式,通过 @JsonProperty 指定字段在 json 中的字段名

序列化

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

Person person = new Person();
person.setName("hatlonely");
person.setBirthday(dateFormat.parse("2018-03-18 15:26:37"));
person.setEmails(Arrays.asList("hatlonely@foxmail.com", "hatlonely@gmail.com"));

ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(person);

assertThat(jsonString, equalTo(
        "{\"name\":\"hatlonely\",\"birthday\":\"2018-03-18 03:26:37\",\"mails\":[\"hatlonely@foxmail.com\",\"hatlonely@gmail.com\"]}"));

使用 ObjectMapper.writeValueAsString 方法就可以序列化成 string

反序列化

String jsonString = "{\"name\": \"hatlonely\", \"birthday\": \"2018-03-18 15:26:37\", \"mails\": [\"hatlonely@foxmail.com\", \"hatlonely@gmail.com\"]}";

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Person person = objectMapper.readValue(jsonString, Person.class);

assertThat(person.getName(), equalTo("hatlonely"));
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
assertThat(person.getBirthday(), equalTo(dateFormat.parse("2018-03-18 15:26:37")));
assertThat(person.getEmails(), equalTo(Arrays.asList("hatlonely@foxmail.com", "hatlonely@gmail.com")));

使用 ObjectMapper.readValue 方法就能实现反序列化,可以通过 configure 方法设置碰到未知的属性不抛异常

参考链接

转载请注明出处
本文链接:http://hatlonely.com/2018/03/18/java-json-%E5%BA%93%E4%B9%8B-jackson/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,292评论 19 139
  • Jackson使用规范以及代码示例 依赖包 Maven依赖: org.codehaus.jackson jacks...
    山石水寿阅读 4,791评论 0 3
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,010评论 6 342
  • 读《庄子——齐物论》里有几句:“毛嫱丽姬,人之所美也,鱼见之深入,鸟见之高飞,麋鹿见之决骤。四者熟知天下之正色哉?...
    第四剑阅读 1,915评论 0 2
  • 年幼时看着邻居家的花草甚是羡慕嫉妒恨,可是家庭拮据,那有闲情摆弄,那好意思开口要求。于是,破瓶、破罐成为了...
    美丽色彩阅读 572评论 3 1