JAVA EE8 中新的 JSON Binding API (JSON-B) 支持在 Java 对象与JSON之间序列化和反序列化(兼容 RFC 7159 ),同时与 JAXB (Java API for XML Binding 2.0) 保持一致。
这个比较容易理解,比如常用的fastjson, 现在只是用jsonb的接口来实现序列化和反序列化,如现有对象Person:
package com.iflytek.jsonb; public class Person { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
将对象Person 实例转为json字符串, 只需要调用Jsonb 的toJson 方法,而将json字符串反序列为对象则调用fromJson即可实现
package com.iflytek.jsonb; import javax.json.bind.Jsonb; import javax.json.bind.JsonbBuilder; public class PersonTest { public static void main(String[] args) { Person p = new Person(); p.setName("LiLei"); p.setAge(15); Jsonb jsonb = JsonbBuilder.create(); String json = jsonb.toJson(p); System.out.println(json); Person p1 = jsonb.fromJson("{"age":4,"name":"HanMeimei"}", Person.class); System.out.println(p1); } }
对于输出的格式,也可以像fastjson一样,定制输出实际想要的内容,下面的代码示例为将name 转为enName, 并且将结果格式化
PropertyNamingStrategy pns = new PropertyNamingStrategy() { @Override public String translateName(String propertyName) { if ("name".equals(propertyName)) { return "enName"; } return propertyName; } }; JsonbConfig config = new JsonbConfig().withPropertyNamingStrategy(pns); config.withFormatting(true); Jsonb jsonb1 = JsonbBuilder.create(config); System.out.println(jsonb1.toJson(p));
当然类似指定名称,也可以用注解简单的实现,而不需要像上述代码这样繁琐,只需要在类属性上添加@JsonbProperty 注解即可
@JsonbProperty("enName") private String name;
Jsonb 默认支持了java8 的time api, 在person 中添加属性birthday
private LocalDate birthday;
序列化或反序列化时可直接转换
Person p1 = jsonb.fromJson("{"age":4,"enName":"HanMeimei","birthday":"2018-05-07"}", Person.class); System.out.println(p1);
更多内容可以参考
http://json-b.net/getting-started.html#
https://www.ibm.com/developerworks/cn/java/j-javaee8-json-binding-1/index.html