详解Jackson 使用以及性能介绍

yizhihongxing

详解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日

相关文章

  • 实例解析JSP中EL表达式的各种运用

    实例解析JSP中EL表达式的各种运用 在JSP页面中,EL表达式是非常常用的一种语法,用于简化代码的编写,提高代码的可读性。本文将详细讲解在JSP中EL表达式的各种运用。 EL表达式的基本语法 EL表达式用${}符号包裹,可以直接在JSP页面中使用。EL表达式的语法格式为${表达式},其中表达式可以是变量、运算符、方法调用等。 变量的使用 EL表达式可以用于…

    Java 2023年6月15日
    00
  • Java Spring Controller 获取请求参数的几种方法详解

    下面是关于“Java Spring Controller 获取请求参数的几种方法详解”的完整攻略,包含两个示例说明。 Java Spring Controller 获取请求参数的几种方法详解 在Java Spring应用程序中,Controller是处理HTTP请求的核心组件。在处理请求时,我们通常需要获取请求参数。本文将详细介绍Java Spring Co…

    Java 2023年5月17日
    00
  • java实现FTP文件上传与文件下载

    下面是Java实现FTP文件上传与文件下载的完整攻略: 一、准备工作 在进行Java实现FTP文件上传与下载之前,需要进行一些准备工作。如下所示: 需要使用FTP服务器,可以使用FileZilla等软件搭建,也可以直接使用云服务器上的FTP服务。 需要引入FTP客户端库,可以使用Apache Commons Net等开源库。 获取FTP服务器的IP地址、端口…

    Java 2023年5月19日
    00
  • Jedis操作Redis数据库的方法

    Jedis是一个Java语言编写的Redis客户端库,它支持多种Redis的操作,并提供了丰富的API供开发者使用。本攻略将详细讲解Jedis操作Redis数据库的方法,包括连接Redis、CRUD操作、事务操作、管道操作和Jedis连接池的使用。 连接Redis Jedis连接Redis非常简单,只需要指定Redis的IP地址和端口即可。以下是连接Redi…

    Java 2023年5月26日
    00
  • Java方法参数传递如何实现

    Java 方法参数传递是值传递,即将实参的值复制一份传递给形参,方法中对形参的任何修改都不会影响实参的值。但对于引用类型变量,其实该变量存储的是对象在内存中的地址,这个地址也是一个值,因此传递引用类型变量时,实际上传递的是该地址值,也就是将内存中的对象地址复制一份传递给形参,此时形参和实参引用的是同一个对象,方法对形参所做的任何修改都会影响该对象的状态,从而…

    Java 2023年5月19日
    00
  • Java transient 关键字是干啥的

    当Java中的对象被序列化时,它们的所有属性(包括私有属性)都将被保存。在某些情况下,某些属性可能不想被序列化。在这种情况下,使用Java中的transient关键字进行标记,表示该属性不应该被序列化,并且不存储在返回的字节数组中。 在Java中,transient是一个关键字,用于标记类成员变量,通常用于序列化和反序列化。 Markdown 格式 在Mar…

    Java 2023年5月20日
    00
  • Java找不到或无法加载主类及编码错误问题的解决方案

    以下是关于“Java找不到或无法加载主类及编码错误问题的解决方案”的完整攻略: 什么是“Java找不到或无法加载主类及编码错误问题”? 在Java程序中可能会出现“找不到或无法加载主类”错误和“编码错误”的问题。这类问题一般出现在程序运行时,这个错误会导致程序无法正常运行,需要进行相应的修复。 造成问题的原因 主类文件位置不正确或文件名拼写错误 classp…

    Java 2023年5月20日
    00
  • Java单例模式的创建,破坏和防破坏详解

    Java单例模式是一种常见的设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。这个设计模式在很多场景中非常有用,比如数据库连接池、日志记录类等。下面我们将详细讲解Java单例模式的创建、破坏和防破坏的攻略。 Java单例模式的创建 Java单例模式的创建有多种方式,以下是比较常见的两种: 静态变量 这种方式是单例模式创建的最简单方式,代码如下: p…

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