文档章节

Gson处理子类和父类中有相同属性bean异常处理

浪子_仗剑走天涯
 浪子_仗剑走天涯
发布于 2016/05/28 22:54
字数 280
阅读 934
收藏 2

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

Gson 2.0之后序列化和反序列化 子类和父类中具有相同属性的bean会抛异常“class XXX declares multiple JSON fields named XXX”, 大致的处理方法有: 1、删除 父类或子类 中重复的属性 2、用 transient 关键字 修饰 子类或父类中不需要序列化的字段 3、为这个类单独注册TypeAdapter 测试代码如下:

Person.class

public class Person {
    private String name;
    private String age;
    // ignore getter and setter
}

Student.class

public class Student extends Person {
    private String name;
    private String score;
    // ignore getter and setter
}

用gson处理student 会跑错如下

String _stu = "{'name':'test','score':'100','age':'20'}";
Gson gson = new GsonBuilder().create();
Student stu = gson.fromJson(_stu, Student.class);

输入图片说明

StudentTypeAdapter.class

public class StudentTypeAdapter extends TypeAdapter<Student> {

    @Override
    public void write(JsonWriter out, Student value) throws IOException {
        out.beginObject();
        out.name("name").value(value.getName());
        out.name("age").value(value.getAge());
        out.name("score").value(value.getScore());
        out.endObject();
    }

    @Override
    public Student read(JsonReader in) throws IOException {
        Student student = new Student();
        in.beginObject();

        while (in.hasNext()) {
            String field = in.nextName();
            if ("name".equals(field)) {
                student.setName(in.nextString());
            } else if ("age".equals(field)) {
                student.setName(in.nextString());
            } else if ("score".equals(field)) {
                student.setScore(in.nextString());
            }else{
                in.skipValue();
            }
        }

        in.endObject();

        return student;
    }
}

这样运行就整常了

String _stu = "{'name':'test','score':'100','age':'20'}";
Gson gson = new GsonBuilder().registerTypeAdapter(Student.class, new StudentTypeAdapter()).create();
Student stu = gson.fromJson(_stu, Student.class);

© 著作权归作者所有

浪子_仗剑走天涯
粉丝 8
博文 20
码字总数 7040
作品 0
北京
后端工程师
私信 提问
加载中

评论(1)

失足程序员
我发现gson真的没有阿里巴巴的fastjson安逸
最全的 SpringBoot 注解大全

一、注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。 其中@ComponentScan让spring Boot扫描到Configuration类并把它......

小致Daddy
10/11
54
0
java编程中的异常分析及面向对象的思考总结[图]

java编程中的异常分析及面向对象的思考总结[图] 1.异常: 程序中出现的不正常现象。 2.异常的由来: 程序在运行的过程中出现了不正常的情况,程序把它看成对象提取了属性行为(名字,原因,位...

原创小博客
2018/08/06
5
0
[springBoot系列]--springBoot注解大全

一、注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它加......

Jack088
2018/12/19
139
0
json的一些属性用法

首先看下面的配置文件中的两种写法:当然Action所在的包必须继承json-default: <package name="default" extends ="json-default" > 第一种: 第二种: 当然,两种方式都能达到相应的效果,但......

zdatbit
2016/07/13
124
0
【SpringBoot系列】SpringBoot注解详解

一、注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让Spring Boot扫描到Configuration类并把它加......

James-
2018/11/23
337
0

没有更多内容

加载失败,请刷新页面

加载更多

密码加密与微服务鉴权JWT详细使用教程

[TOC] 1.1、了解微服务状态 微服务集群中的每个服务,对外提供的都是Rest风格的接口,而Rest风格的一个最重要的规范就是:服务的无状态性。 什么是无状态? 1.服务端不保存任何客户端请求者信...

庭前云落
19分钟前
6
0
Xamarin.FormsShell基础教程(9)Shell相关类体系

Xamarin.FormsShell基础教程(9)Shell相关类体系 在Shell中,最为主要的类是Shell类。Shell类实现了大多数应用程序所需的基本UI功能的页面。除此以外,常用的类还有ShellContent、Tab、Fly...

大学霸
21分钟前
4
0
聊聊MVC、MVP、MVVM吧

先来介绍下本文结构: 三种框架的具体概念 在安卓开发上的写法、优缺点 1.概念 1.1 MVC MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模...

二营长的意大利炮手
38分钟前
4
0
如果解释Python,什么是.pyc文件?

我已经了解Python是一种解释型语言......但是,当我查看我的Python源代码时,我看到.pyc文件,Windows将其识别为“编译的Python文件”。 这些来自哪里? #1楼 Python代码经历了两个阶段。 第...

javail
43分钟前
4
0
.NET Core初览

初览的应用场景为游戏服务器开发。所以测试在侧重点上更强于IO和密集型计算 TODO

梦想游戏人
46分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部