gson自定义反序列化器

反序列化(Unserialize)漏洞详解 序列化和反序列化漏洞分析   序列化(serialize) 就将对象的状态信息转换为可以存储或传输的形式的过程 在序列化期间,对象将当前的状态写入到临时或持久性的存储区 【将状态信息保存为字符串】。   反序列化(unserialize) 就是把序列化之后的字符串在转化为对象。 其实在序列化的过程中是没有任何的漏洞的,产生漏洞的主要的原因就是在反序列化的过程中,通过我们的恶意篡改会产生魔法函数绕过,字符逃逸,远程命令执行等漏洞,最早发现这些漏洞的大佬是真的牛。 一、简单的魔法函数 魔法函数 调用 阅读详情

写在前面

gson提供了一套强大的序列化、反序列化器。但某些场景下,如反序列化父子类时,gson现成反序列化器只能识别到父类的属性信息,子类属性会丢失。 普通的反序列化器是不能用的。需要自定义反序列化器,强加自己的业务逻辑。不是闲着蛋疼去实现自定义的序列化器。

举个栗子

school对象

public class School {

    private String name;

    private List<People> peopleList;
}    

父类

public class People {

    private String name;

    private int age;
}    

子类

public class Student extends People {

    private Long cardId;
}

直接用gson现成的反序列化器

public static void main(String[] args) {

        List<People> peopleList = Lists.newArrayList();

        Student student = new Student("威少", 20, 666666L);
        peopleList.add(student);

        School school = new School("实验", peopleList);

        String json = gson.toJson(school);

        School r = gson.fromJson(json, School.class);

        System.out.println(gson.toJson(r));
}

结果 :

{
  "name": "实验",
  "peopleList": [
    {
      "name": "威少",
      "age": 20
    }
  ]
}

如此一来,我们可以看出来,用gson默认的反序列化器,是会丢失student的cardId属性信息的。下面我们来解决这个问题

自定义反序列化器

  • 实现接口 JsonDeserializer
重写方法
        @Override
        public VideoTemplate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
  • 完成demo
public class JsonDeserializerDemo {

    /**
     * special gson
     */
    private final static Gson gson;

    static {
        GsonBuilder gsonBuilder = new GsonBuilder();
        JsonDeserializer<School> deserializer = new DefineDeserializer();
        gsonBuilder.registerTypeAdapter(School.class, deserializer);
        gson = gsonBuilder.create();
    }

    public static class DefineDeserializer implements JsonDeserializer<School> {

        @Override
        public School deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

            School school = new School();

            JsonObject jsonObject = json.getAsJsonObject();
            JsonElement name = jsonObject.get("name");
            school.setName(name.getAsString());

            List<People> peopleList = new ArrayList<>();
            school.setPeopleList(peopleList);

            JsonArray jsonArray = json.getAsJsonObject().get("peopleList").getAsJsonArray();
            for(JsonElement jsonElement : jsonArray) {

                JsonObject asJsonObject = jsonElement.getAsJsonObject();
                String stuName = asJsonObject.get("name").getAsString();
                Long cardId = asJsonObject.get("cardId").getAsLong();
                int age = asJsonObject.get("age").getAsInt();

                Student student = new Student(stuName, age, cardId);
                peopleList.add(student);
            }

            return school;
        }
    }

    public static void main(String[] args) {

        List<People> peopleList = Lists.newArrayList();

        Student student = new Student("威少", 20, 666666L);
        peopleList.add(student);

        School school = new School("实验", peopleList);

        String json = gson.toJson(school);

        School r = gson.fromJson(json, School.class);

        System.out.println(gson.toJson(r));


    }
}

result

{
  "name": "实验",
  "peopleList": [
    {
      "cardId": 666666,
      "name": "威少",
      "age": 20
    }
  ]
}
Android 中使用Gson完成对象的序列化与反序列化 前言: JSON(JavaScript ObjectNotation):是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。 Gson简介:Gson是Google提供的用来在java对象和json数据之间进行映射的java类库,可以将一个JSON字符串转成一个java对象(反序列化),或者将java对象转成一个JSON字符串(序列化)。 在Android 下build.gradle下引入依赖: 接下来用一个使用Gson将Student类型对象进行序列化,与反序列 1.Student类 阅读详情

相关推荐

14、使用Gson解析和创建JSON对象

本文介绍了如何使用Gson库解析和创建JSON对象,包括通过自定义反序列化器处理复杂JSON结构、通过自定义序列化器生成特定格式的JSON对象,并深入探讨了Gson的注解功能和其他高级特性。示例代码展示了从Java对象到JSON的序列化过程以及JSON到Java对象的反序列化过程,适用于希望掌握Gson在JSON处理中高级用法的开发者。

study的专栏 124

Gson实现接口自定义反序列化

在项目中同样遇到了对json字符串进行反序列化时,遇到了多态情况下,无法找到对应类,所以写这篇文章来mark一下 首先抛出原始代码,再给上解决方案~ 原始代码: 原始json串: {"type":"int","specs":{"min":"1","max":"12","unit":"aw","unitName":"饱和度","step":"1"}} TslDataType对象,Type 为内部枚举类,TslSpecs为接口,对应枚举类类型的各个实现类 TslDataType:构造方法中t...

TOP__ONE的博客 1940

VirtualBox增强功能安装全指南:从下载到配置复制粘贴功能

本文详细介绍了VirtualBox增强功能的完整安装与配置流程,重点解决了虚拟机与主机间复制粘贴、文件拖放等核心协作难题。通过分步指南和故障排查,帮助用户在不同操作系统(如Windows、Linux)中实现无缝集成,提升虚拟化工作效率与体验。

weixin_29206669的博客 419

Json自定义反序列化

通过 JsonDeserializer 来实现自定义反序列化

weixin_46061449的博客 1168

详细介绍pytorch重要的API

Tensor 是 PyTorch 中最基本的数据结构,提供了多种创建和操作张量的函数。Autograd 提供了自动求导功能,可以跟踪 Tensor 上的操作并计算梯度。损失函数用于衡量模型预测值与真实值之间的差异,提供了多种损失函数。是构建神经网络的基础类,提供了定义网络层和前向传播的方法。提供了 GPU 计算的支持,包括设备管理、内存管理等。提供了一些常用的函数式操作,如激活函数、损失函数等。提供了常用的数据集、模型架构和图像转换工具。提供了数据加载和预处理的工具,包括。

hello! 1223

Python程序—定子故障三相永磁同步电动机振动与电流数据集

1.0 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为2.26%: 匝间短路故障,严重度为2.70%: 匝间短路故障,严重度为3.35%: 匝间短路故障,严重度为4.41%: 匝间短路故障,严重度为6.48%: 匝间短路故障,严重度为12.17%: 匝间短路故障,严重度为21.69%1.5 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为1.57%: 匝间短路故障,严重度为1.88%: 匝间短路故障,严重度为2.34%

m0_66465741的博客 1321

GSON自定义适配器,重写fromJson类属性为字符串的反序列化,解决gson替换fastjson兼容性问题

我们的目标技术选型为GSON,移除fastjson依赖,创建JSONUtils中fastjson全包名的类来兼容接口入参,这样引用JSONUtils的其他类不用修改,达到只修改工具类组件即可全局修改的目的。测试中json与对象互转没异常,但历史数据或三方服务给到的json字符串有无法转换为目标对象的个例,为了达到无侵入其他类的代码块完成升级改造的目标,我们进行了研究。gson fastjson BEGIN_ARRAY BEGIN_ARRAY BEGIN_OBJECT 源码阅读

幸福太随意的博客 1780

simulink可控励磁同步电机模型分析

他励同步电机模型分析

qq_26681609的博客 5552

3步搞定复杂JSON!Gson自定义反序列化器实战指南

你是否还在为嵌套JSON结构解析头痛?当API返回的JSON格式与Java对象不匹配时,手动映射字段既繁琐又易错。本文将通过3个简单步骤,教你使用Gson自定义反序列化器轻松处理复杂JSON,让数据解析效率提升10倍!读完你将掌握:自定义反序列化器的创建方法、注册流程以及实战案例解析。 ## 为什么需要自定义反序列化器? 默认情况下,Gson通过反射机制将JSON字段与Java对象字段直接映射...

gitblog_01032的博客 322

基于MATLAB实现的克里金插值的代码

参考代码 克里金插值matlab代码 youwenfan.com/contentcsb/81657.html。

jghhh01的博客 483

ANSYS HFSS 中的相控天线阵列仿真方法

相控天线阵列系统广泛使用,从国防雷达应用到商业 5G 应用。设计这些天线阵列涉及复杂的数学运算,需要全波仿真。Ansys HFSS 全场 3D 电磁仿真软件可以在合理的时间内以较低的计算成本仿真复杂的相控阵天线系统,同时考虑复杂激励、环境(即附近的天线)和平台对其性能的影响。本博客介绍了可用于有效仿真相控天线阵列的不同方法。以下是不同仿真方法的简要概述,视频链接中提供了完整的演示。ANSYS HFSS 提供 4 种不同的相控天线阵列仿真方法:1) 晶胞-无限阵列。

jkh920184196的博客 4256

java控制序列化版本,Java GSON自定义反序列化器版本控制支持

I created a custom deserializer for my Person class. This is just for demonstration purpose. My actual class is more complicated.The json file contains the version of the format and after that an arra...

weixin_39679091的博客 141

AutoCAD Plant 3D自定义零件库实战:手把手教你用Python创建参数化槽式三通

本文详细介绍了如何利用Python脚本在AutoCAD Plant 3D中创建参数化槽式三通组件,从API原理到实战开发,帮助用户构建高效的自定义零件库。通过Python装饰器系统控制零件属性和行为,实现几何建模、参数管理和规格编辑器集成,提升工业管道设计的标准化和效率。

weixin_28267011的博客 332

GSON速学必会

一. GSON 简介 GSON是一个Java语言编写的用于处理JSON数据格式的开源应用程序编程接口项目。它将Java对象转换为JSON表示。还可以用于将JSON字符串转换为等效的Java对象。 gson包包含了JSON数据处理的所有常见类和接口。gson内部的子包reflect,annotation, 和stream。reflect包包含处理Java泛型类型信息的类和接口。...

aitong0065的博客 150

NVIDIA Isaac Sim 联合 VS Code 开发调试环境配置

在 Visual Studio Code (VS Code) 中打开 Isaac Sim 软件包主文件夹,即可打开该工作区。注意建议在学习教程和示例时使用 Visual Studio Code。另请参见有关 VS Code 工作区的详细信息,请参阅 Visual Studio Code (VS Code) 文档。

2506_90492529的博客 3105

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

在Gson中传递uri对象

GSONgson是安卓开发中一个流行的Json格式转换包。只要简单的两行代码就可以实现自定义对象和JSON格式的互转。从而极大地简化数据传递前的序列化操作。 官方github在这里https://github.com/google/gson// 将person类对象转JSON格式 Gson gson = new Gson(); String personInStringToAdd = gson.t

LoHiauFung的博客 1217

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java未指定主类,java-GSON解析未指定的类型变量

我使用GSON库解析服务器JSON响应.后端人员有时会告诉我:“由于某种原因,我们无法在JSON中指定变量类型”(旧的php,他们不知道如何执行操作,依此类推等等).GSON喜欢在对象模型中进行强类型化.因此,我无法将Object解析为String.GSON等待:{"service":{"description":null,"name":"Base","id":"4c7a90410529"}}但是...

weixin_29410959的博客 411

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

gson使用教程-翻译7

原文地址:http://www.studytrails.com/java/json/java-google-json-custom-serializer-deserializer.jsp就如我们之前看到的教程,Gson提供自定义序列化器和反序列化器.如果我们不需要Gson默认的转换方式,我们可以通过自定义序列化器和反序列化器来转换java对象和json.下面的第一个demo是展示自定义序列化器和第二

hncgc1990的专栏 596

Gson解析一个泛型对象时如何处理

Gson解析一个泛型对象时如何处理

Leonnnn2020的博客 451

java反序列化gson_java – Gson使用不同的值类型反序列化json

您可以使用自定义反序列化器执行此操作.在开始时,我们应该创建可以代表您的JSON的数据模型.class JsonEntity {private List movies;public List getMovies() {return movies;}public void setMovies(List movies) {this.movies = movies;}@Overridepublic St...

weixin_27210125的博客 241

Gson自定义序列化与反序列化

前言 在使用Gson的时候我们经常需要根据自己的需求定义序列化和反序列化的规则,本文主要讲解如何优雅地进行Gson的序列化和反序列化。 序列化 方法 实现JsonSerializer接口 注册自定义的序列化实现 demo 自定义UserInformationBeanSerializer并实现JsonSerializer接口 public class User...

ai-exception的博客 4859

Gson用户使用文档

1.概述 2.Gson的目标 3.Gson的性能和扩展性 4.Gson的使用者 5.如何使用Gson - 通过Maven来使用Gson - 基本举例 - 对象举例 - 使用对象的好处 - 嵌套类(包括内部类) - 数组举例 - 集合举例 - 集合的局限性 - 泛型的序列化和反序列化 - 任意类型集合的序列化和反序列化 - 内置的序列化器和反序列化器 - 定制的序列化和

492

Java:Json反序列化自定义类

本文介绍了在Java中使用Jackson和Gson库实现JSON反序列化的方法。通过示例代码演示了如何将JSON字符串转换为自定义类对象,包括依赖配置(Maven)和基本操作步骤。Jackson使用ObjectMapper的readValue方法,而Gson通过fromJson实现反序列化。文中还强调了字段匹配、构造函数处理(如@JsonCreator注解)和日期类型转换等注意事项,并提及两种库对特殊情况的处理方式(如自定义反序列化器)。适用于需要处理JSON数据的Java开发者。

chinalog的专栏 491

Gson详解

我平时使用到的Gson库主要

googlevsbing的专栏 1724

Gson——Gson反序列化

转自http://www.importnew.com/16786.html 一个简单的实例 比方说,我们有如下JSON对象,它包含两位著名作者的畅销Java书(Amazon)。 { 'title': 'Java Puzzlers: Traps, Pitfalls, and Corner Cases', 'isbn-10': '032133678X', 'isbn-

chuntiandejiaobu10的专栏 1060

Gson 中文指南

网上很多 Gson 的文章介绍的比较琐碎,于是干脆把 GitHub 上的使用介绍给翻译了出来。 原文地址:https://github.com/google/gson/blob/master/UserGuide.md Gson 库中最重要的类是 Gson,你可以通过调用 new Gson() 来创建一个 Gson 对象。同时也提供一个 GsonBuilder 类来创建一个 Gson 对象,

Eateeer 的笔记屋 5608
上一篇: Runtime-陌生的小伙子
下一篇: Ibatis Iterate的使用
csdn_xpw
博客等级 码龄12年 28粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值