{一起看DZone}JSON-B 是个什么鬼

大家好,我是William李梓峰,欢迎一起看DZone。

今天翻翻 DZone Java 首页的时候,偶然看到一则消息:

Java EE 8: June 2017 Recap
https://dzone.com/articles/java-ee-8-june-2017-recap

文章里头大概讲了 Java EE 8 在 Java EE Expert Group 评审的进度。
偶然发现了 JSON-B (JSR 367)这个新规范特性,这意味着以后用最新版的 Tomcat 就可以直接用了,不用自己 depend。

JSON-B 是个什么鬼

按照惯例,先来个官网:

JSON-B 官网
http://json-b.net/index.html

对于我这个两年 Java 工作经验的初级工程师来说,看到新东西,不用跳 Getting Started ,而是直接从 User Guide 入手了解。

再来个User Guide:

JSON-B User Guide
http://json-b.net/users-guide.html

JSON-B 就是跟 Gson 一样。提供序列化和反序列化 Java 类 到 JSON 的特性。

JSON-B 的依赖

    <!-- JSON-P API -->
    <dependency>
        <groupId>javax.json</groupId>
        <artifactId>javax.json-api</artifactId>
        <version>1.1</version>
    </dependency>

    <!-- JSON-P RI -->
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.1</version>
        <scope>runtime</scope>
    </dependency>

    <!-- JSON-B API -->
    <dependency>
        <groupId>javax.json.bind</groupId>
        <artifactId>javax.json.bind-api</artifactId>
        <version>1.0.0-RC2</version>
    </dependency>

    <!-- Yasson (JSON-B RI) -->
    <dependency>
        <groupId>org.eclipse</groupId>
        <artifactId>yasson</artifactId>
        <version>1.0.0-RC1</version>
        <scope>runtime</scope>
    </dependency>

JSON Binding API

这种是最简单的玩法:

Jsonb jsonb = JsonbBuilder.create();

官方给了这么简单的例子:

// 不用 getter setter,逆天了
public class Dog {
    public String name;
    public int age;
    public boolean bitable;
}

// JSON-B 作者应该也是写 JavaScript 的
// Create a dog instance
Dog dog = new Dog();
dog.name = "Falco";
dog.age = 4;
dog.bitable = false;

// Create Jsonb and serialize 序列化
Jsonb jsonb = JsonbBuilder.create();
String result = jsonb.toJson(dog);    // 跟 gson 一样简洁

// Deserialize back 反序列化
dog = jsonb.fromJson("{name:\"Falco\",age:4,bitable:false}", Dog.class);

有人会立马问个泛型机制的老大难问题,
像 List<XXX> 这种怎么反序列化?
难道又要自己写 Converter ?
JSON-B 话你知:No No No

// List of dogs
List<Dog> dogs = new ArrayList<>();
dogs.add(falco);
dogs.add(cassidy);

// Create Jsonb and serialize
Jsonb jsonb = JsonbBuilder.create();
String result = jsonb.toJson(dogs);

// Deserialize back
dogs = jsonb.fromJson(
    result, 
    new ArrayList<Dog>(){}
        .getClass()
        .getGenericSuperclass() 
);

没错就是用 getGenricSuperclass() 来做序列化,本质上还是直接 Dog.class 。

JSON-B 的配置类

JSON-B 还有个专门的配置类,让JSON的输入输出更加灵活多变,例如格式化输出等等。

// Create custom configuration
JsonbConfig config = new JsonbConfig();

// Create Jsonb with custom configuration
Jsonb jsonb = JsonbBuilder.create(config);

格式化输出的例子:

// Create custom configuration with formatted output
JsonbConfig config = new JsonbConfig()
    .withFormatting(true);

// Create Jsonb with custom configuration
Jsonb jsonb = JsonbBuilder.create(config);

// Use it!
String result = jsonb.toJson(pojo);

哎呀,还有好多很好玩的格式化输出特性啊,这里没位置写了,我再写多一个超级棒的,@JsonDateFormat 和 @JsonNumberFormat:

public class Person {
    public String name;

    // 膜拜吧
    @JsonbDateFormat("dd.MM.yyyy")
    private Date birthDate;

    // 颤抖吧
    @JsonbNumberFormat(“#0.00")
    public BigDecimal salary;
}

如果 SpringBoot 能够直接支持 JSON-B 就好了,恩, Spring Framework 5 好像真的直接支持哦。(这里求考证)

今天就写这么多,更多关于 JSON-B 的资料请看上面贴出的官网啊。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容