详解Jackson 使用以及性能介绍

详解Jackson 使用以及性能介绍

Jackson 简介

Jackson 是一个用于在Java对象和 json 数据之间进行转换的框架。它支持众多 json 数据格式,诸如 JSON-LDSMILE 等。Jackson 是一个流式处理 JSON 的工具,它很容易与其它 JSON 处理工具进行集成,同时在序列化和反序列化性能方面也表现得相当优异。

Jackson 基本使用

引入 Jackson

在项目中使用 Jackson 首先需要引入对 Jackson 的依赖。

如果你使用的是 Maven,你可以在项目的 pom.xml 文件里添加以下依赖:

<!-- Jackson -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.12.5</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.12.5</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.12.5</version>
</dependency>

序列化

序列化是将 Java 对象转换成 json 数据的过程。使用 Jackson 进行序列化非常简单。

ObjectMapper objectMapper = new ObjectMapper();

Person person = new Person("Tony", "Stark", "Iron Man");
String json = objectMapper.writeValueAsString(person);
System.out.println(json);

以上代码中,我们首先创建了一个 ObjectMapper 对象,它是 Jackson 的核心类之一。然后创建了一个 Person 对象,并将其序列化成了一个 json 数据。

反序列化

反序列化是将 json 数据转换成 Java 对象的过程。同样的,使用 Jackson 进行反序列化也非常简单。

String json = "{\"firstName\":\"Tony\",\"lastName\":\"Stark\",\"alias\":\"Iron Man\"}";

ObjectMapper objectMapper = new ObjectMapper();

Person person = objectMapper.readValue(json, Person.class);
System.out.println(person);

以上代码中,我们首先创建了一个 Person 对象的 json 数据,然后创建了一个 ObjectMapper 对象,并使用 readValue 方法将其转换成了一个 Person 对象。

Jackson 性能介绍

Jackson 是一个性能优异的 JSON 处理框架。以下是一个对其性能表现的简单测试:

public class JacksonPerformanceTest { 
  private static ObjectMapper objectMapper = new ObjectMapper();

  @Test
  public void testPerformance() throws IOException {
    Person person = new Person("Tony", "Stark", "Iron Man");

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    objectMapper.writeValue(baos, person);
    byte[] bytes = baos.toByteArray();

    long start = System.nanoTime();
    for (int i = 0; i < 100000; i++) {
      objectMapper.readValue(bytes, Person.class);
    }
    long end = System.nanoTime();
    System.out.println("time cost = " + (end - start) / 1000000.0 + "ms");
  }
}

以上代码中,我们首先创建了一个 Person 对象,并将其序列化成了一个 json 数据。然后使用 readValue 方法将其转化成一个 Person 对象。在测试中,我们使用了一个 for 循环,重复地执行了 100000 次该操作,并记录了执行时间。

这个测试的结果是,执行 100000 次序列化和反序列化操作的时间为 610ms 左右。极大地证明了 Jackson 的性能在处理 JSON 数据时的优越性。

示例

示例 1:处理复杂的 json 数据

假设你要解析一份包含多个复杂对象的 JSON 数据,比如:

[
  {
    "name": "John",
    "age": 30,
    "address": {
      "street": "104 Langton Street",
      "city": "San Francisco",
      "state": "CA",
      "zipCode": "94103"
    }
  },
  {
    "name": "Jane",
    "age": 25,
    "address": {
      "street": "30 Washington Street",
      "city": "Boston",
      "state": "MA",
      "zipCode": "02108"
    }
  }
]

以下是处理该 JSON 数据的示例代码:

public class Address {
  private String street;
  private String city;
  private String state;
  private String zipCode;

  public String getStreet() {
    return street;
  }

  public void setStreet(String street) {
    this.street = street;
  }

  public String getCity() {
    return city;
  }

  public void setCity(String city) {
    this.city = city;
  }

  public String getState() {
    return state;
  }

  public void setState(String state) {
    this.state = state;
  }

  public String getZipCode() {
    return zipCode;
  }

  public void setZipCode(String zipCode) {
    this.zipCode = zipCode;
  }

  @Override
  public String toString() {
    return "Address{" +
            "street='" + street + '\'' +
            ", city='" + city + '\'' +
            ", state='" + state + '\'' +
            ", zipCode='" + zipCode + '\'' +
            '}';
  }
}

public class Person {
  private String name;
  private int age;
  private Address address;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public Address getAddress() {
    return address;
  }

  public void setAddress(Address address) {
    this.address = address;
  }

  @Override
  public String toString() {
    return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", address=" + address +
            '}';
  }
}

public class JacksonDemo {
  public static void main(String[] args) throws IOException {
    String json = "[\n" +
            "  {\n" +
            "    \"name\": \"John\",\n" +
            "    \"age\": 30,\n" +
            "    \"address\": {\n" +
            "      \"street\": \"104 Langton Street\",\n" +
            "      \"city\": \"San Francisco\",\n" +
            "      \"state\": \"CA\",\n" +
            "      \"zipCode\": \"94103\"\n" +
            "    }\n" +
            "  },\n" +
            "  {\n" +
            "    \"name\": \"Jane\",\n" +
            "    \"age\": 25,\n" +
            "    \"address\": {\n" +
            "      \"street\": \"30 Washington Street\",\n" +
            "      \"city\": \"Boston\",\n" +
            "      \"state\": \"MA\",\n" +
            "      \"zipCode\": \"02108\"\n" +
            "    }\n" +
            "  }\n" +
            "]";

    ObjectMapper objectMapper = new ObjectMapper();
    JavaType collectionType = objectMapper.getTypeFactory().constructCollectionType(List.class, Person.class);
    List<Person> persons = objectMapper.readValue(json, collectionType);

    for (Person person : persons) {
      System.out.println(person);
    }
  }
}

示例 2:序列化和反序列化 Map

Jackson 还可以处理序列化和反序列化 Map 对象。以下是一个简单的示例代码:

public static void main(String[] args) throws IOException {
    String json = "{\"name\":\"Tony\",\"age\":30,\"address\":{\"city\":\"San Francisco\",\"state\":\"CA\"}}";

    ObjectMapper objectMapper = new ObjectMapper();
    JavaType mapType = objectMapper.getTypeFactory().constructMapType(HashMap.class, String.class, Object.class);
    Map<String, Object> map = objectMapper.readValue(json, mapType);
    System.out.println(map);

    String json2 = objectMapper.writeValueAsString(map);
    System.out.println(json2);
}

该代码中,我们先定义了一个包含复杂元素的 Map 对象,然后使用 readValue 方法将其转换成了一个 Map 对象,并将其打印出来。接着,我们再把该 Map 对象序列化成一个 json 字符串,并将其打印出来。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Jackson 使用以及性能介绍 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Spring MVC 图片的上传和下载功能

    Spring MVC 图片的上传和下载功能 在Web应用程序中,图片的上传和下载是非常常见的需求。SpringMVC提供了很多方便的方式来实现图片上传和下载。本文将详细讲解SpringMVC实现图片的上传和下载的完整攻略,包括如何配置文件上传和下载的相关参数、如何使用MultipartFile对象处理图片上传、如何使用ResponseEntity对象处理图片…

    Java 2023年5月18日
    00
  • springmvc无法访问/WEB-INF/views下的jsp的解决方法

    解决 SpringMVC 无法访问 /WEB-INF/views 下的 JSP 的问题,可以尝试以下步骤: 确认 SpringMVC 配置 首先,需要在 SpringMVC 的配置文件 dispatcher-servlet.xml 中确认以下配置: <!– 配置 InternalResourceViewResolver –> <bean…

    Java 2023年6月15日
    00
  • SpringBoot多环境开发该如何配置

    Spring Boot 多环境开发配置攻略 在本文中,我们将详细讲解 Spring Boot 多环境开发配置的完整攻略。我们将使用 Spring Boot 2.5.0 版本的源码进行分析。 步骤一:创建多个配置文件 在 Spring Boot 中,我们可以为不同的环境创建不同的配置文件。例如,我们可以为开发环境创建一个名为 application-dev.p…

    Java 2023年5月15日
    00
  • Java中使用JDBC操作数据库简单实例

    下面是详细的Java中使用JDBC操作数据库的完整攻略。 1. JDBC简介 Java Database Connectivity (JDBC) 是一种能够让Java程序与各种数据库进行连接、查询、更新、插入和删除等操作的API。使用JDBC API进行数据库操作的通常步骤如下: 加载JDBC驱动程序。 建立JDBC连接。 创建JDBC Statement或…

    Java 2023年5月19日
    00
  • Java axios与spring前后端分离传参规范总结

    Java axios与Spring前后端分离传参规范总结 本攻略主要介绍了在Java axios与Spring前后端分离的开发中,如何进行传参规范。 一、传参规范 在前后端分离的开发中,一般通过JSON格式传递参数。在发送请求时,需要规范JSON数据的格式,保证后端能够正确解析参数。 以axios请求为例,将参数封装在data属性中,如下: javascri…

    Java 2023年6月3日
    00
  • 利用Springboot实现Jwt认证的示例代码

    本文将为大家详细讲解如何使用Spring Boot实现JWT认证,并提供两个示例说明。请按照下面的步骤操作。 前置条件 在开始之前,您需要了解: Java及其相关技术(Java web开发、Spring Boot框架等); JWT(JSON Web Token)认证方式的基本概念和使用方法。 步骤 1. 添加依赖 请在您的项目中添加Spring Securi…

    Java 2023年5月31日
    00
  • Java利用for循环打印菱形的实例教程

    下面是Java利用for循环打印菱形的实例教程的完整攻略。 题目分析 我们需要打印一个菱形,实际上就是一个对称的四边形。那么我们可以通过for循环嵌套来实现。 代码实现 import java.util.Scanner; public class PrintDiamond { public static void main(String[] args) { …

    Java 2023年5月26日
    00
  • java实现简单年龄计算器

    Java实现简单年龄计算器 简介 在这篇文章中,我们将会学习如何用Java编写一个简单的年龄计算器,可以输入生日日期,程序将会计算出当前的年龄。 前置知识 在编写本文所述的程序时,需要具备以下知识: Java基础语法 日期时间相关类的使用 步骤 获取当前时间 java LocalDateTime today = LocalDateTime.now(); 这里…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部