Jackson使用

一、Jackson介绍

Jackson 是常用的 Json 解析工具,可以轻松的将 Java 对象转换成 json 对象和 xml 文档,同样也可以将 json、xml 转换成 Java 对象,Spring MVC 默认就是采用 Jackson 来解析 Json。此外,Jackson是开源免费的,源代码托管在 GitHub 上。

二、Jackson注解

Jackson 类库包含了很多注解,可以让我们快速建立 Java 类与 JSON 之间的关系,这些注解标注在实体类的属性上。常用的注解如下所示:

  • **@JsonProperty:**用来修改序列化后的 JSON 属性名,默认情况下 JSON 属性名取对象中的属性名,也可以通过 value 属性指定 JSON 属性名。如果需要的话,该注解还有一个 index 属性指定生成 JSON 属性的顺序。
  • **@JsonIgnore:**用于排除某个属性,这样该属性就不会被 Jackson 序列化和反序列化。
  • **@JsonIgnoreProperties:**这个注解定义在类上的,用来排除对象中的某些属性。比如在序列化 JSON 的时候,@JsonIgnoreProperties({"prop1", "prop2"}) 会忽略 pro1 和 pro2 两个属性。在从 JSON 反序列化为 Java 类的时候,@JsonIgnoreProperties(ignoreUnknown=true) 会忽略所有没有 Getter 和 Setter 的属性。该注解在 Java 类和 JSON 不完全匹配的时候很有用。
  • **@JsonIgnoreType:**也是定义在类上的,会排除所有指定类型的属性。
  • @JsonPropertyOrder:@JsonPropertyOrder 和 @JsonProperty 的 index 属性类似,用来指定属性序列化时的顺序。
  • **@JsonRootName:**用于指定 JSON 根属性的名称。
  • @JsonInclude:@JsonInclude(JsonInclude.Include.NON_NULL):对值为 null 的属性不进行序列化
  • **@JsonFormat:**添加到需要指定格式的日期属性上,指定日期属性序列化与反序列化时的格式。timezone = "GMT+8" 设置时区,表示 +8 小时,否则会少8小时。ObjectMapper 序列化 POJO 对象为 json 字符串时,Date 日期类型默认会转为 long 长整型,json 字符串反序列化为 POJO 时自动将长整型的日期转为 Date 类型。

三、Jackson的使用

**导入依赖:**jackson-databind 内部依赖了 jackson-annotations 与 jackson-core,所以 Maven 应用时,只要导入 databind 一个,则同时也导入了 annotations 与 core 依赖。

<!-- 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>

如果是 springboot 项目,它内部已经包含了 Jackson,只需要引入 web 模块即可

3.1 从JSON中获取Java对象

JSON字符串-->Java对象
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonToObject {

    public static void main(String[] args) {

        ObjectMapper objectMapper = new ObjectMapper();
        String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 6 }";

        try {
            Car car = objectMapper.readValue(carJson, Car.class);
            System.out.println(car);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        
    }
}
JSON字符输入流-->Java对象
ObjectMapper objectMapper = new ObjectMapper();
String carJson ="{ \"brand\" : \"Mercedes\", \"doors\" : 4 }";
Reader reader = new StringReader(carJson);
Car car = objectMapper.readValue(reader, Car.class);
JSON文件-->Java对象
ObjectMapper objectMapper = new ObjectMapper();
File file = new File("data/car.json");
Car car = objectMapper.readValue(file, Car.class);
包含JSON的URL--->Java对象
ObjectMapper objectMapper = new ObjectMapper();
URL url = new URL("file:data/car.json");
Car car = objectMapper.readValue(url, Car.class);
JSON字节输入流-->Java对象
ObjectMapper objectMapper = new ObjectMapper();
InputStream input = new FileInputStream("data/car.json");
Car car = objectMapper.readValue(input, Car.class);
JSON二进制数组-->Java对象
ObjectMapper objectMapper = new ObjectMapper();
String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

byte[] bytes = carJson.getBytes("UTF-8");
Car car = objectMapper.readValue(bytes, Car.class);
JSON数组-->Java对象数组
String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
ObjectMapper objectMapper = new ObjectMapper();
Car[] cars2 = objectMapper.readValue(jsonArray, Car[].class);
JSON数组-->List集合
String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
ObjectMapper objectMapper = new ObjectMapper();
List<Car> cars = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>(){});
System.out.println(cars);
JSON字符串-->Map集合
String jsonObject = "{\"brand\":\"ford\", \"doors\":5}";
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> jsonMap = objectMapper.readValue(jsonObject,new TypeReference<Map<String,Object>>(){});
System.out.println(jsonMap);
忽略未知的JSON字段

有时候,在将JSON字符串转为Java对象时,JSON中的字段更多。 Jackson在默认情况下会抛出异常,报不知道XYZ字段异常,因为在Java对象中找不到该字段。但是,有时应该允许JSON中的字段多于相应的Java对象中的字段。 只需要在ObjectMapper对象中设置如下属性即可。

objectMapper.configure(
    DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

3.2 将对象写入JSON

Java对象-->JSON

Jackson ObjectMapper也可以用于从对象生成JSON。 可以使用以下方法之一进行操作:

  • writeValue()
  • writeValueAsString()
  • writeValueAsBytes()

ObjectMapper的writeValueAsString()和writeValueAsBytes()方法是分别将一个Java对象转为JSON字符串或者字节数组返回。 下面是writeValueAsString()的示例:

ObjectMapper objectMapper = new ObjectMapper();

Car car = new Car();
car.setBrand("宝马");
car.setDoors(4);

String json = null;
json = objectMapper.writeValueAsString(car);
System.out.println(json);

writeValue()方法用来将Car对象转换为JSON字符串并将其写入给定的FileOutputStream。

ObjectMapper objectMapper = new ObjectMapper();

Car car = new Car();
car.setBrand("BMW");
car.setDoors(4);

objectMapper.writeValue(new FileOutputStream("data/output-2.json"), car);
相关推荐
雾月557 分钟前
LeetCode 3146 两个字符串的排列差
java·数据结构·算法·leetcode
Bro_cat16 分钟前
JavaEE 前后端交互与数据库连接练习
java·服务器·数据库·java-ee·tomcat·交互
ybq1951334543120 分钟前
javaEE-文件操作和IO-文件
java·java-ee
ybq1951334543122 分钟前
javaEE-多线程进阶-JUC的常见类
java·开发语言
blammmp23 分钟前
JavaEE 初阶:线程(2)
java·开发语言
正在绘制中37 分钟前
Java重要面试名词整理(二十):Gateway&SkyWalking
java·面试·gateway·skywalking
qq_4585638140 分钟前
通过excel导入数据
java·excel
南─1 小时前
深入解析 Redisson 分布式限流器 RRateLimiter 的原理与实现
java·分布式·redisson
m0_748240541 小时前
Springboot 3项目整合Knife4j接口文档(接口分组详细教程)
java·spring boot·后端
阿松のblog1 小时前
蓝桥杯JAVA--003
java·职场和发展·蓝桥杯