大家好,我是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 評審的進度型型。
偶然發(fā)現(xiàn)了 JSON-B (JSR 367)這個新規(guī)范特性,這意味著以后用最新版的 Tomcat 就可以直接用了全蝶,不用自己 depend闹蒜。
JSON-B 是個什么鬼
按照慣例,先來個官網(wǎng):
JSON-B 官網(wǎng)
http://json-b.net/index.html
對于我這個兩年 Java 工作經(jīng)驗的初級工程師來說抑淫,看到新東西绷落,不用跳 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 作者應(yīng)該也是寫 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() 來做序列化管呵,本質(zhì)上還是直接 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 好像真的直接支持哦晶框。(這里求考證)
今天就寫這么多排抬,更多關(guān)于 JSON-B 的資料請看上面貼出的官網(wǎng)啊懂从。