大家好,我是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 的资料请看上面贴出的官网啊。