fantasy

风色幻想

我与春风皆过客,你携秋水揽星河

fantasy

1602 字

前言

目前Java流行的Json数据处理工具主要有JacksonGsonFastJson等,其中FastJson频繁曝出数据解析漏洞、Gson在一般场景下数据处理效率比Jackson要低,故最终选择使用Jackson作为自己项目的Json数据处理工具。本文主要介绍了Jackson基本概念、常用方法以及常用场景。

介绍

Jackson是一个简单基于JavaJSON库,它具有非常强大的数据绑定功能,并提供了一个框架,可方便的让你进行自定义的Java对象与JsonXMLCSVProtobufCBOR对象间相互转化。Jackson所依赖的jar包较少,简单易用性能也要相对较高,并且Jackson社区相对比较活跃,更新速度也比较快。

使用

导入依赖

  1. Maven项目导入
    Maven引入直接在pom.xml文件中加入以下代码:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.11.0</version>
</dependency>
  1. Java项目导入
    将以下三个Jar包下载并导入项目:

常用对象

ObjectMapper对象

ObjectMapper类是Jackson库的主要类。它提供了Java对象和Json之间的转化,主要通过JsonParserJsonGenerator实例来完成实际的对Json数据的读写操作。

  1. 配置
// 美化输出
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);
  1. 常用方法有:
方法名 说明
ObjectMapper configure() 更改此对象映射器的开/关序列化功能状态的方法
<T> T readValue() 用于将其他数据类型转为Java类型
JsonNode readTree() 方法将JSON内容反序列化为对应的Java树,返回结果树的根
void writeValue() 可用于将任何Java值序列化为JSON输出,写入指定位置
String writeValueAsString() 可用于将任何Java值序列化为JSON字符串
String writeValueAsBytes() 可用于将任何Java值序列化为字节数组

JsonFactory对象

Jackson包的主要工厂类,用于配置和构造reader(又名parser, JsonParser)和writer(又名generator, JsonGenerator)实例,这个工厂实例是线程安全的,如果有配置的话,可以重复使用。其常用方法有:

方法名 说明
JsonGenerator createJsonGenerator() 用于构造JSON生成器,将JSON内容按特定编码写入(覆盖)指定的文件
JsonGenerator createJsonParser() 用于构造解析给定类型内容的解析器

JsonGenerator对象

这个类主要是用来生成Json格式的内容的,我们可以使用JsonFactory的方法生成一个实例。

JsonParser对象

这个主要是用来读取Json格式的内容,并且完成解析操作的,我们可以使用JsonFactory的方法生成一个实例。

场景

文件存取——法一

User user = new User();
ObjectMapper mapper = new ObjectMapper(); 
//将Java对象(List、Map……)序列化到一个JSON文件
mapper.writeValue(new File("D:/fantasy.json"), user);

//读取JSON文件转换为对象(List、Map……)
user = mapper.readValue(new File("fantasy.json"), User.class);
System.out.println(user);

文件读取——法二

ObjectMapper mapper = new ObjectMapper();
JsonFactory jsonFactory = new JsonFactory();
JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File("D:/fantasy.json"), JsonEncoding.UTF8);
mapper.writeTree(jsonGenerator, dataJson);

常用对象互转

ObjectMapper mapper = new ObjectMapper();
//json字符串转对象
User user = mapper.readValue(jsonString, User.class);
System.out.println(user);

//对象转json字符串
jsonString = mapper.writeValueAsString(user);
System.out.println(jsonString);

//json字符串转为Map对象
Map map=mapper.readValue(jsonString, Map.class);
System.out.println(map);

Json转List

ObjectMapper mapper = new ObjectMapper();
List<User> userList = mapper.readValue(jsonString, new TypeReference<List<User>>() {});

总结

以上便是Jackson的使用介绍,之后遇到新的使用场景时会及时更新。

支付宝打赏二维码
微信打赏二维码

最新文章