JSON序列化/反序列化的工具非常多,Google的Gson、Alibaba号称世界最快的FastJson、实现了Java官方的JSON Binding API(JSR 367)的Eclipse Yasson和Apache Johnzon。
这些库始终都不如Jackson好用。不仅仅因为Jackson具有极致的可扩展性,可以无痛对接文本格式XML、csv, properties, yaml和二进制格式的avro, cbor, ion, protobuf, smile,还因为他有简单易用的多态反序列化功能。Gson等库实现多态反序列化做法非常的不优雅。
多态反序列化可以让应用的设计具有极致的可扩展性。这就像schemaless的MongoDB与schemaful的MySQL的区别。
在MySQL中存储一个多态的JSON字段即可实现schemaless,可以极大的简化复杂应用的开发。
用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type", visible = true)
@JsonSubTypes({ @JsonSubTypes.Type(value = Vehicle.ElectricVehicle.class, name = "ELECTRIC_VEHICLE"), @JsonSubTypes.Type(value = Vehicle.FuelVehicle.class, name = "FUEL_VEHICLE") }) public class Vehicle {
public String type;
public static class ElectricVehicle extends Vehicle {
String autonomy; String chargingTime;
}
public static class FuelVehicle extends Vehicle {
String fuelType; String transmissionType;
} }
|
测试例子:
1 2 3 4 5 6 7 8
| @Test public void whenDeserializingPolymorphic_thenCorrect() throws JsonProcessingException { String json = "{\"type\":\"ELECTRIC_VEHICLE\",\"autonomy\":\"500\",\"chargingTime\":\"200\"}";
Vehicle vehicle = new ObjectMapper().readerFor(Vehicle.class).readValue(json);
assertEquals(Vehicle.ElectricVehicle.class, vehicle.getClass()); }
|
参考文档:
本作品采用 知识共享署名 4.0 国际许可协议 进行许可。
转载时请注明原文链接:https://blog.hufeifei.cn/2022/04/Java/polymorphic-deserialization/