首页 > 其他分享 >gson如何序列化子类

gson如何序列化子类

时间:2023-10-19 20:22:41浏览次数:32  
标签:name gson 化子 public 序列 new type class

需求

目前有一个需求,不同对象有一些公共属性,分别也有一些不同的属性。对方传过来的json字符串中,把这些对象组成了一个数组返回过来的。这样该如何反序列化呢?

举例

定义Person类、Student类、Worker类;

@Data
@ToString
public class Person {
    //姓名
    private String name;
    //年龄
    private Integer age;
    //类型,0代表Student,1代表worker
    private Integer type;
}

@Data
@ToString
public class Student extends Person{
    //学校
    private String school;
}

@Data
@ToString
public class Worker extends Person{
    //薪水
    private Integer salary;
}

字符串为:

{
    "group":[
        {
            "school":"Hello中学",
            "name":"张三",
            "age":16,
            "type":0
        },
        {
            "salary":100000,
            "name":"李四",
            "age":35,
            "type":1
        }
    ]
}

如果我们直接使用Gson来解析,解析代码如下:

public class MyTest {
    public static void main(String[] args) {
        Gson gson = new Gson();
        String jsonStr = "{\"group\":[{\"school\":\"Hello中学\",\"name\":\"张三\",\"age\":16,\"type\":0},{\"salary\":100000,\"name\":\"李四\",\"age\":35,\"type\":1}]}";
        Type type = new TypeToken<PersonGroup>() {
        }.getType();

        PersonGroup personGroup = gson.fromJson(jsonStr, type);
        //为了打断点
        System.out.println();
    }
}

解析后的内容如下:

解析后的内容

通过解析后的内容可以发现,并不能满足我们的需求。

解决方案

自定义一个反序列化配置,用来识别父类下的各个子类,反序列化时装配其原始类型。

public class PersonDesrializer implements JsonDeserializer<Person> {
    private Gson gson = new Gson();

    private Map<Integer, Class<? extends Person>> typeMap = new HashMap<>();

    public PersonDesrializer() {
        typeMap.put(0,Student.class);
        typeMap.put(1,Worker.class);
    }

    @Override
    public Person deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
        JsonObject jsonObject = jsonElement.getAsJsonObject();
        Class<? extends Person> typeClazz = this.typeMap.get(jsonObject.get("type").getAsInt());
        return gson.fromJson(jsonElement,typeClazz);
    }
}

反序列化方式如下:

public class MyTest {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
                .serializeNulls()
                .registerTypeAdapter(Person.class, new PersonDesrializer())
                .create();
        String jsonStr = "{\"group\":[{\"school\":\"Hello中学\",\"name\":\"张三\",\"age\":16,\"type\":0},{\"salary\":100000,\"name\":\"李四\",\"age\":35,\"type\":1}]}";
        Type type = new TypeToken<PersonGroup>() {
        }.getType();

        PersonGroup personGroup = gson.fromJson(jsonStr, type);
        //为了打断点
        System.out.println();
    }
}

序列化结果

从序列化结果来看,已经转换成功,满足我们的要求。

标签:name,gson,化子,public,序列,new,type,class
From: https://www.cnblogs.com/nicaicai/p/17775515.html

相关文章

  • 由Django-Session配置引发的反序列化安全问题
    漏洞成因漏洞成因位于目标配置文件settings.py下关于这两个配置项SESSION_ENGINE:在Django中,SESSION_ENGINE 是一个设置项,用于指定用于存储和处理会话(session)数据的引擎。SESSION_ENGINE 设置项允许您选择不同的后端引擎来存储会话数据,例如:数据库后端 (django.contrib.sessions.b......
  • 算法笔记-有效括号序列题解
    描述给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列。括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。数据范围:字符串长度0≤n≤10000要求:空间复杂度O(n),时间复杂......
  • Python自激励阈值自回归(SETAR)、ARMA、BDS检验、预测分析太阳黑子时间序列数据
    全文链接:https://tecdat.cn/?p=33896原文出处:拓端数据部落公众号这篇文章展示了自激励阈值自回归SETAR的使用,用于分析经常被客户研究的太阳黑子数据集。具体而言,研究SETAR模型的估计和预测。我们在这里考虑原始的太阳黑子序列以匹配ARMA示例,尽管文献中许多来源在建模之前对序......
  • R语言时变向量自回归(TV-VAR)模型分析时间序列和可视化|附代码数据
    全文链接:http://tecdat.cn/?p=22350 最近我们被客户要求撰写关于时变向量自回归(TV-VAR)模型的研究报告,包括一些图形和统计输出。在心理学研究中,个人主体的模型正变得越来越流行。原因之一是很难从人之间的数据推断出个人过程另一个原因是,由于移动设备无处不在,从个人获得的时间......
  • C#上位机序列9: 批量读写+事件广播
    1.读取配置文件及创建变量信息(点位名称,地址,数据类型(bool/short/int/float/long/double))2.读任务&写任务,数据有变化时事件广播通知usingHslCommunication;usingHslCommunication.Core;usingHslCommunication.ModBus;usingPLCEvent.Util;usingSystem;usingSystem.......
  • 3.3-时间序列和Resample函数
    3.3-时间序列和Resample函数  3.3.1时间序列¶index横坐标为日期数据数据导入:pandasreader3.3.2Resample函数¶计数、均值、方差、累加、累乘周期转换数据验证:for循环vs内置函数 In [ ]:pipinstallpandas_datareader ......
  • 下拉选项 数据验证 选择序列
    在Excel中设置下拉选项的步骤如下12:打开Excel,点击选中一个单元格,点击数据;然后点击数据验证;之后点击任何值边上的下拉箭头,选择序列;然后在来源中输入多个下拉选项,例如“男,女”,男和女之间用英文逗号隔开;之后我们点击确定;然后我们点击下拉箭头;可以看到里面有很多个下拉选项可以选择。......
  • TSMixer:谷歌发布的用于时间序列预测的全新全mlp架构
    这是谷歌在9月最近发布的一种新的架构TSMixer:Anall-MLParchitecturefortimeseriesforecasting,TSMixer是一种先进的多元模型,利用线性模型特征,在长期预测基准上表现良好。据我们所知,TSMixer是第一个在长期预测基准上表现与最先进的单变量模型一样好的多变量模型,在长期预测......
  • 最长上升子序列
    引入以下记\(s\)的长度为\(n\),\(t\)的长度为\(m\)。一些问题:什么是子序列?称\(t\)是\(s\)的子序列,即是\(s\)删掉一些元素(可以什么都不删)后可以得到\(t\)。什么是上升子序列?称\(t\)是上升子序列,仅当\(s\)的子序列\(t\)满足\(\foralli\in[1,m),t_i<t_{......
  • n log n 的求最长上升子序列
    \(O(n\logn)\)的求最长上升子序列法一:二分intLIS(){intb[MAXN],top=0,a[MAXN];b[0]=-1;for(inti=1;i<=n;i++){if(a[i]>b[top]){top++,b[top]=a[i];}else{intl=1,r=top;w......