{一起看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 的依赖

    
    
        javax.json
        javax.json-api
        1.1
    

    
    
        org.glassfish
        javax.json
        1.1
        runtime
    

    
    
        javax.json.bind
        javax.json.bind-api
        1.0.0-RC2
    

    
    
        org.eclipse
        yasson
        1.0.0-RC1
        runtime
    

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 这种怎么反序列化?
难道又要自己写 Converter ?
JSON-B 话你知:No No No

// List of dogs
List 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(){}
        .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 的资料请看上面贴出的官网啊。

你可能感兴趣的:({一起看DZone}JSON-B 是个什么鬼)