JSON-B和Yasson详解

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/79059116 JSON-B和Yasson详解2018.1.14版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/79059116

JSON-B和Yasson详解

  • 2018.1.14
  • 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

JSON-B是Java EE 8规范中的新API之一。它用于解决标准化Java对象如何在JSON中进行序列化。

JSON-B,即Java API for JSON Binding,用于JSON绑定的Java API,是一套最新的API,也是Java EE 8规范的一部分。JSON-B规范试图标准化Java对象在JSON中序列化/反序列化的方式,并在这方面定义了一套标准的API。

本文将展示JSON-B API提供的核心功能。

一、建立项目

创建一个新的Maven项目,添加如下依赖关系:

<dependencies>
    <dependency>
        <groupId>javax.json.bind</groupId>
        <artifactId>javax.json.bind-api</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse</groupId>
        <artifactId>yasson</artifactId>
        <version>1.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.1.2</version>
    </dependency>
</dependencies>

注意:由于Yasson(JSON-B参考实现)在内部依赖于JSON-P API,所以对类路径添加了对JSON-P参考实现的依赖。如果将来使用另一个JSON-B实现,或者如果要在运行时已经提供此依赖关系的应用程序服务器上部署应用程序,则可能不需要这样做。

二、Eclipse Yasson

Eclipse Yasson是JSON-B规范的参考实现,与XML领域的JAXB相似。Yasson是JSR-367规范(JSON Binding)官方的参考实现。

Yasson定义了一个在现有Java类和JSON文档之间的默认的映射算法,适合大多数情况:

Jsonb jsonb=  JsonbBuilder.create();
String result = jsonb.toJson(someObject);

如果还不够,可以使用它提供的一组丰富的注释和API来实现定制的功能:

// 创建自定义配置
JsonbConfig config = new JsonbConfig()
        .withNullValues(true)
        .withFormating(true);
// 使用自定义配置来创建Jsonb
Jsonb jsonb = JsonbBuilder.create(config);
// 使用它
String result = jsonb.toJson(someObject);

三、JSON-B API

JSON-B API在javax.json.bind包内提供。最重要的接口是Jsonb,它可以通过名为JsonbBuilder的构建器类来实例化。当有这个类的引用时,你可以调用toJson或fromJson方法之一来对JSON字符串进行序列化和反序列化。

Shape shape = new Shape();
shape.setArea(12);
shape.setType("RECTANGLE");
Jsonb jsonb = JsonbBuilder.create();

// 将对象shape序列化为JSON
String jsonString = jsonb.toJson(shape);  // 输出:{"area":12, "type":"RECTANGLE"}
// 将一个JSON字符串反序列化为一个对象
Shape s = jsonb.fromJson("{\"area\":12, \"type\":\"RECTANGLE\"}");

请注意,对于反序列化过程,类应该有一个默认的构造函数,否则会抛出一个异常。

JSON-B的API非常精炼,几乎不涉及复杂性。在javax.jsonb包下提供的所有其他API和注解(数量很少)仅用于定制序列化和反序列化的过程。

四、基本的Java类型映射

Java基本类型及其相应的包装类被序列化为JSON的方式遵循其toString()方法文档定义的转换过程。同样,对于反序列化过程,使用其parse()方法(parseInt,parseLong等)定义的转换过程。然而,参考实现没有必要调用这些方法,只要遵守它们的转换过程即可。

为了演示如何将这些类型映射到JSON,请考虑一个名为Apartment的类,其结构如下:

public class Apartment {
    private boolean rented;
    private byte rooms;
    private int price;
    private long id;
    private float loan;
    private double area;
    private char district;
    private String ownerName;
    public boolean isRented() {
        return rented;
    }
    public void setRented(boolean rented) {
        this.rented = rented;
    }
    public byte getRooms() {
        return rooms;
    }
    public void setRooms(byte rooms) {
        this.rooms = rooms;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public float getLoan() {
        return loan;
    }
    public void setLoan(float loan) {
        this.loan = loan;
    }
    public double getArea() {
        return area;
    }
    public void setArea(double area) {
        this.area = area;
    }
    public char getDistrict() {
        return district;
    }
    public void setDistrict(char district) {
        this.district = district;
    }
    public String getOwnerName() {
        return ownerName;
    }
    public void setOwnerName(String ownerName) {
        this.ownerName = ownerName;
    }
}

下面的代码片段试图序列化这个类的一个实例:

import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;

public class Application {
    public static void main(String[] args) {
        Apartment apartment = new Apartment();
        apartment.setRented(true);
        apartment.setRooms((byte) 4);
        apartment.setPrice(7800000);
        apartment.setId(234L);
        apartment.setLoan(3580000.4f);
        apartment.setArea(432.45);
        apartment.setDistrict('S');
        apartment.setOwnerName("Nerssi");

        Jsonb jsonb = JsonbBuilder.create();
        String jsonString = jsonb.toJson(apartment);
        System.out.println(jsonString);
    }
}

执行程序,JSON输出显示如下(添加注释使其更具可读性):

{
    "area":432.45,        // double
    "district":"S",       // char
    "id":234,             // long
    "loan":3580000.5,     // float
    "ownerName":"Nerssi", // String
    "price":7800000,      // int
    "rented":true,        // boolean
    "rooms":4             // byte
}

可以看出,每个字段使用的值与在相应的包装类上调用toString方法完全相同。此外,字符串String类和字符Character类都转换为UTF-8字符串。

目录
相关文章
|
Oracle 架构师 Java
Java 22 新增利器: 使用 Java Stream Gather 优雅地处理流中的状态
本文中我们分析了 什么 是 “流”,对比了 Java 上几种常见的 “流”库,引入和详细介绍了 Java 22 中的 Stream Gather API 。同时也简单分享了利用虚拟线程 如何简化 Stream map Concurrent操作符的实现。希望抛砖引玉和大家分享新的特性,共同进步。同时也希望大家都可以升级到新版本的 JDK,更好的赋能业务。
|
10月前
|
监控 安全 调度
彻底解决5大开源痛点,阿里云发布任务调度 XXL-JOB 版
阿里云任务调度XXL-JOB版 迎来重磅发布,以任务调度SchedulerX为内核,0代码改造,完全兼容开源XXL-JOB客户端接入,解决开源XXL-JOB痛点问题。
1323 135
|
Java 开发者 Spring
【SpringBoot 异步魔法】@Async 注解:揭秘 SpringBoot 中异步方法的终极奥秘!
【8月更文挑战第25天】异步编程对于提升软件应用的性能至关重要,尤其是在高并发环境下。Spring Boot 通过 `@Async` 注解简化了异步方法的实现。本文详细介绍了 `@Async` 的基本用法及配置步骤,并提供了示例代码展示如何在 Spring Boot 项目中创建与管理异步任务,包括自定义线程池、使用 `CompletableFuture` 处理结果及异常情况,帮助开发者更好地理解和运用这一关键特性。
1626 1
|
JSON Java Maven
关于使用Java-JWT的笔记
这篇文章介绍了使用Java-JWT库来生成和验证JSON Web Tokens (JWT) 的方法。文中解释了JWT的组成,包括头部、载荷和签名,并提供了如何使用java-jwt库生成和验证token的示例代码。此外,还提供了Maven依赖和一些关于token的标准声明和自定义声明的解释。
关于使用Java-JWT的笔记
|
JSON Java API
jjwt使用说明-笔记
这篇文章介绍了如何使用jjwt库在Java中生成和验证JSON Web Tokens (JWT)。文章提供了在Maven项目中添加jjwt依赖的步骤,生成token的方法,以及如何验证token的示例代码。此外,还包含了一些关于token标准载荷和自定义载荷的说明,以及如何处理token验证过程中可能遇到的异常。
jjwt使用说明-笔记
|
SQL Java 关系型数据库
【MyBatis】3、一文介绍如何用 MyBatis 进行多表级联查询
【MyBatis】3、一文介绍如何用 MyBatis 进行多表级联查询
302 0
|
监控 前端开发 网络协议
如何使用Spring Boot实现WebSocket通信
如何使用Spring Boot实现WebSocket通信
|
消息中间件 存储 Apache
Apache Paimon 表模式最佳实践
Apache Paimon 表模式最佳实践
3766 57
|
存储 缓存 JSON
详解HTTP四种请求:POST、GET、DELETE、PUT
【4月更文挑战第3天】
67006 5
详解HTTP四种请求:POST、GET、DELETE、PUT
|
Java Shell
Gradle的安装及换源
Gradle的安装及换源
6912 1