栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JSON根据类型反序列化

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JSON根据类型反序列化



所有这些都可以通过注释来完成。

使用“ metadata”和“ owner”等通用字段及其获取器/设置器创建一个抽象超类。此类需要使用@JsonTypeInfo进行注释。它应该看起来像:

@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY, property = "type")

使用该参数,property = “type”您可以指定将类别标识符序列化为JSON文档中的字段类型。

可以使用来指定类标识符的值use。Id.CLASS使用标准的Java类名称。您也可以使用Id.MINIMAL_CLASS缩写Java类名。要使用自己的标识符,请使用Id.NAME。在这种情况下,您需要声明子类型:

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")@JsonSubTypes({    @JsonSubTypes.Type(value = Foo.class, name = "Foo"),    @JsonSubTypes.Type(value = Bar.class, name = "Bar")})

通过扩展抽象超类来实现Foo和Bar类。

Jackson的ObjectMapper将使用JSON文档的其他字段“类型”进行序列化和反序列化。例如 当您将JSON字符串反序列化为超类引用时,它将属于适当的子类:

ObjectMapper om = new ObjectMapper();Abstractbase x = om.readValue(json, Abstractbase.class);// x will be instanceof Foo or Bar

完整的代码示例(我使用公共字段作为无需编写getter / setter的快捷方式):

package test;import com.fasterxml.jackson.annotation.JsonTypeInfo;import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.annotation.JsonTypeInfo.As;import java.io.IOException;import com.fasterxml.jackson.annotation.JsonSubTypes;@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")@JsonSubTypes({    @JsonSubTypes.Type(value = Foo.class, name = "Foo"),    @JsonSubTypes.Type(value = Bar.class, name = "Bar")})public abstract class Abstractbase {    public metaData metaData;    public Owner owner;    @Override    public String toString() {        return "metaData=" + metaData + "; owner=" + owner;    }    public static void main(String[] args) throws IOException {        // Common fields        Owner owner = new Owner();        owner.name = "Richard";        metaData metaData = new metaData();        metaData.data = "Some data";        // Foo        Foo foo = new Foo();        foo.owner = owner;        foo.metaData = metaData;        CustomObject customObject = new CustomObject();        customObject.id = 20l;        customObject.fizz = "Example";        Data data = new Data();        data.object = customObject;        foo.data = data;        System.out.println("Foo: " + foo);        // Bar        Bar bar = new Bar();        bar.owner = owner;        bar.metaData = metaData;        bar.data = "A String in Bar";        ObjectMapper om = new ObjectMapper();        // Test Foo:        String foojson = om.writevalueAsString(foo);        System.out.println(foojson);        Abstractbase fooDeserialised = om.readValue(foojson, Abstractbase.class);        System.out.println(fooDeserialised);        // Test Bar:        String barjson = om.writevalueAsString(bar);        System.out.println(barjson);        Abstractbase barDeserialised = om.readValue(barjson, Abstractbase.class);        System.out.println(barDeserialised);    }}class Foo extends Abstractbase {    public Data data;    @Override    public String toString() {        return "Foo[" + super.toString() + "; data=" + data + ']';    }}class Bar extends Abstractbase {    public String data;    public String toString() {        return "Bar[" + super.toString() + "; data=" + data + ']';    }}class Data {    public CustomObject object;    @Override    public String toString() {        return "Data[object=" + object + ']';    }}class CustomObject {    public long id;    public String fizz;    @Override    public String toString() {        return "CustomObject[id=" + id + "; fizz=" + fizz + ']';    }}class metaData {    public String data;    @Override    public String toString() {        return "metaData[data=" + data + ']';    }}class Owner {    public String name;    @Override    public String toString() {        return "Owner[name=" + name + ']';    }}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/470142.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号