# 一.基本介绍

# 1.什么是 jackson?

Jackson 是一个用于在 Java 应用程序中处理 JSON 格式数据的开源库。它提供了一组功能强大的工具,使开发人员能够轻松地在 Java 对象和 JSON 数据之间进行转换。Jackson 库包含多个模块,其中最常用的两个是:

  1. jackson-databind: 这是 Jackson 库的核心模块,提供了 JSON 和 Java 对象之间的数据绑定。它允许你将 Java 对象转换为 JSON 格式(序列化),或将 JSON 数据转换为 Java 对象(反序列化)。

  2. jackson-core: 这个模块提供了一些基本的 JSON 处理功能,如读取和写入 JSON 树模型。它是 jackson-databind 的基础。

使用 Jackson,你可以轻松地在你的 Java 应用程序中进行 JSON 数据的处理,这在与 Web 服务、前端交互、数据存储等方面非常常见。Jackson 的广泛应用使其成为 Java 生态系统中处理 JSON 的首选库之一。

# 2.jackson 优点?

Jackson 作为 Java 生态系统中处理 JSON 数据的主要库之一,具有许多优点,使其受到广泛使用。以下是一些 Jackson 库的主要优点:

  1. 性能高效: Jackson 被设计为高性能的 JSON 处理库。它通过使用基于流的处理模型以及一些优化技术,提供了快速的序列化和反序列化性能。

  2. 广泛支持: Jackson 提供了对 Java 对象到 JSON 数据的序列化和反序列化的全面支持。它可以处理复杂的 Java 对象图,包括嵌套和循环引用等情况。

  3. 灵活性: Jackson 提供了许多配置选项和定制功能,使开发人员能够根据其特定需求调整库的行为。这种灵活性使得 Jackson 适用于各种不同的应用场景。

  4. 支持 JSON 树模型: Jackson 的 jackson-core 模块支持 JSON 树模型,使开发人员可以以树的形式访问和操作 JSON 数据。这对于处理动态或未知结构的 JSON 数据非常有用。

  5. 集成广泛: Jackson 被广泛集成到许多 Java 框架和库中,包括 Spring、JAX-RS、Hibernate 等。这种集成使得在这些框架中使用 Jackson 变得非常简单。

  6. 开源和活跃的社区: Jackson 是一个开源项目,拥有活跃的社区支持。这意味着它不断得到更新、改进,并且有大量的文档和示例可用于帮助开发人员更好地使用它。

Jackson 是一个功能强大、高效且灵活的 JSON 处理库,适用于各种 Java 应用程序。

# 二.jackson 使用

# 1.依赖

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
1
2
3
4
5
6
7
8

# 2.json 字符串转对象

/**
 * 字符串转对象
 *
 * @throws Exception
 */
@Test
public void test1() throws Exception {
    ObjectMapper objectMapper = new ObjectMapper();
    String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
    Car car = objectMapper.readValue(carJson, Car.class);
    System.out.println(objectMapper.writeValueAsString(car));
}
1
2
3
4
5
6
7
8
9
10
11
12

# 3.对象转 json 字符串

/**
* 对象转字符串
*
* @throws Exception
*/
@Test
public void test2() throws Exception {
  Car car = new Car();
  car.setBrand("宝马");
  car.setDoors(8);
  System.out.println(new ObjectMapper().writeValueAsString(car));
}
1
2
3
4
5
6
7
8
9
10
11
12

# 4.二进制数组转 json 对象

/**
* 二进制数组转对象
*
* @throws Exception
*/
@Test
public void test3() throws Exception {
  ObjectMapper objectMapper = new ObjectMapper();
  String carJson =
          "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
  byte[] bytes = carJson.getBytes("UTF-8");
  Car car = objectMapper.readValue(bytes, Car.class);
  System.out.println(objectMapper.writeValueAsString(car));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 5.json 字符串转 list 集合

/**
 * 字符串转lsit
 *
 * @throws Exception
 */
@Test
public void test4() throws Exception {
    String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
    ObjectMapper objectMapper = new ObjectMapper();
    List<Car> cars = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>() {
    });
    System.out.println(objectMapper.writeValueAsString(cars));
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 6.list 转 json 字符串

/**
 * list转字符串
 *
 * @throws Exception
 */
@Test
public void test5() throws Exception {
    List<Car> cars = new ArrayList<>();
    Car car1 = new Car();
    car1.setBrand("宝马");
    car1.setDoors(8);
    cars.add(car1);
    Car car2 = new Car();
    car2.setBrand("奔驰");
    car2.setDoors(10);
    cars.add(car2);
    System.out.println(new ObjectMapper().writeValueAsString(cars));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 7.json 字符串转 map

/**
 * 字符串转map
 *
 * @throws Exception
 */
@Test
public void test6() throws Exception {
    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(objectMapper.writeValueAsString(jsonMap));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 8.可见性配置

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
objectMapper.setVisibility(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY));
1
2
3

这段代码是使用 Jackson 库中的 ObjectMapper 类来配置 JSON 的反序列化行为。

  1. ObjectMapper objectMapper = new ObjectMapper();:这行代码创建了一个新的 ObjectMapper 实例,它是 Jackson 库中用于处理 JSON 的核心类。ObjectMapper 可以用来序列化(将 Java 对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为 Java 对象)。

  2. objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);:这行代码调用 ObjectMapper 的 disable 方法,禁用了在反序列化过程中对于未知属性的处理。通常情况下,如果 JSON 中包含 Java 对象中未定义的属性,Jackson 会抛出异常。通过禁用这个特性,可以使得 Jackson 在遇到未知属性时不会抛出异常,而是忽略它们。

  3. objectMapper.setVisibility(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY));:这行代码设置了 ObjectMapper 的可见性检查器(VisibilityChecker),并将字段的可见性设置为 ANY。这意味着 ObjectMapper 在序列化和反序列化过程中将考虑所有的字段,不论它们是否被声明为私有、受保护或公共。这样设置可以确保 ObjectMapper 能够访问到所有字段,而不仅仅是公共字段。

综合来说,这段代码的作用是创建了一个 ObjectMapper 实例,并对其进行了配置,以确保在反序列化 JSON 字符串时能够忽略未知属性,并且能够访问到所有的字段。

# 三.fastjson 对比

# 1.json 字符串转对象

json字符串转对象

//转对象
Myclass myclass = JSONObject.parseObject(jsonStr , Myclass.class);// jsonStr 是String类型。
//转list对象
List<NewPxtOrder> pxtOrderList = JSONObject.parseArray(order,NewPxtOrder.class);
1
2
3
4

# 2.fastjson 不能转对象的情况

String redisKey = supplierRelateServiceManager.getRedisKey();
String checkOrderInfo = jedis.get(redisKey);
//  SelfOrderModel selfOrderModel = JSONObject.parseObject(checkOrderInfo, SelfOrderModel.class);
// selfOrderModel.setRejectReason(outExamineVo.getRemark());
JSONObject jsonObject = JSONObject.parseObject(checkOrderInfo);
jsonObject.put("rejectReason", outExamineVo.getRemark());
jedis.set(redisKey, jsonObject.toJSONString());
1
2
3
4
5
6
7
上次更新: 10/29/2024, 10:27:50 AM