详解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\SpringBoot配置连接数据库的方法

    下面是Spring\SpringBoot配置连接数据库的方法的完整攻略。 1. Spring中配置连接数据库的方法 1.1 在Spring配置文件中配置 在Spring配置文件中配置连接数据库的方式是最常见的方法。 <!– 数据库连接信息 –> <bean id="dataSource" class="or…

    Java 2023年5月20日
    00
  • 利用SpringMVC过滤器解决vue跨域请求的问题

    利用 SpringMVC 过滤器解决 Vue 跨域请求的问题 在 Vue 开发中,我们经常会遇到跨域请求的问题。为了解决这个问题,我们可以使用 SpringMVC 过滤器来实现。本文将详细讲解如何利用 SpringMVC 过滤器解决 Vue 跨域请求的问题,并提供两个示例说明。 解决跨域请求的问题 在 Vue 开发中,我们经常会遇到跨域请求的问题。这是因为浏…

    Java 2023年5月18日
    00
  • Java线程死锁代码详解

    这里我给你提供一份“Java线程死锁代码详解”的攻略,希望能对你有所帮助。 背景介绍 线程死锁在多线程环境下是非常常见的情况,而解决线程死锁也非常困难,因此需要我们对线程死锁有一个深入的了解。本文将详细讲解Java线程死锁的原因、示例以及如何解决死锁。 什么是线程死锁? 当两个或更多的线程互相持有对方所需要的资源,同时等待对方释放资源,就会出现线程死锁。可以…

    Java 2023年5月24日
    00
  • java的Hibernate框架报错“SessionException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“SessionException”错误。这个错误通常是由于以下原因之一引起的: 会话已关闭:如果您尝试在会话关闭后使用会话,则可能会出现此错误。在这种情况下,需要确保在使用会话之前打开会话,并在使用完毕后关闭会话。 事务已回滚:如果您尝试在事务已回滚后使用会话,则可能会出现此错误。在这种情况下,需要确保在…

    Java 2023年5月4日
    00
  • 纯jsp打造无限层次的树代码

    关于“纯jsp打造无限层次的树代码”的攻略,主要涉及到以下几个方面: 1.准备工作 在开始打造树代码之前,需要准备好数据。一般来说,树形结构的数据可以使用嵌套的Map、List或是递归对象等进行表示。同时,可以根据实际需求,对数据进行排序、分页等操作。 2.代码实现 在jsp页面中打造树代码,主要是通过使用标签库、JavaScript等技术实现的。我们可以通…

    Java 2023年6月15日
    00
  • spring快速入门实例教程

    下面我来详细讲解一下“spring快速入门实例教程”的完整攻略。 一、前置条件 在学习本教程之前,需要掌握Java编程基础和基本的Spring框架概念。 二、环境搭建 安装JDK:下载并安装Java开发工具包(JDK) 安装IDEA:下载并安装IntelliJ IDEA集成开发环境 创建Maven项目:在IDEA中创建一个基于Maven的Spring项目 三…

    Java 2023年5月19日
    00
  • Java中为什么重写equals()也需要重写hashCode()?

    所有类默认继承Object类 先看一下Object源码 package java.lang; public class Object { //默认调用本地的hashcode()方法 根据内存地址生成hash值 避免不了哈希冲突 public native int hashCode(); //默认调用的equals方法比较的是’==’比较 //基本类型比较的是…

    Java 2023年4月25日
    00
  • python 调用HBase的简单实例

    下面是详细讲解“python 调用HBase的简单实例”的完整攻略: 简介 HBase是一个基于Hadoop的分布式NoSQL数据库,其数据存储在HDFS(Hadoop文件系统)上,能够存储大量结构化或非结构化数据。我们可以使用Python编程语言来连接HBase数据库,并对数据进行操作。 前置条件 在进行操作之前需要保证以下条件已满足: 系统中已安装HBa…

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