fastjson反序列化泛型类

2023-11-18

为了代码通用,你的定义对象可能是一个泛型对象,其中可变的data属性的类型参数化。那么这个泛型类型的对象,反json化时应该注意些什么呢?

  1. Response类型

     public static class Response<T> {
            private String msg;
            private String code;
            private T data;
    
            public String getMsg() {
                return msg;
            }
    
            public void setMsg(String msg) {
                this.msg = msg;
            }
    
            public String getCode() {
                return code;
            }
    
            public void setCode(String code) {
                this.code = code;
            }
    
            public T getData() {
                return data;
            }
    
            public void setData(T data) {
                this.data = data;
            }
    
            @Override
            public String toString() {
                return "Response{" +
                        "msg='" + msg + '\'' +
                        ", code='" + code + '\'' +
                        ", data=" + data +
                        '}';
            }
        }
    
    //额外的pojo类
    public static class User {
            private String name;
            private String id;
    
            public User() {
            }
    
            public User(String name, String id) {
                this.name = name;
                this.id = id;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            public String getId() {
                return id;
            }
    
            public void setId(String id) {
                this.id = id;
            }
    
            @Override
            public String toString() {
                return "User{" +
                        "name='" + name + '\'' +
                        ", id='" + id + '\'' +
                        '}';
            }
        }
    
        public static class Student {
            private String nickname;
            private int age;
    
            @Override
            public String toString() {
                return "Student{" +
                        "nickname='" + nickname + '\'' +
                        ", age=" + age +
                        '}';
            }
    
            public Student() {
            }
    
            public Student(String nickname, int age) {
                this.nickname = nickname;
                this.age = age;
            }
    
            public String getNickname() {
                return nickname;
            }
    
            public void setNickname(String nickname) {
                this.nickname = nickname;
            }
    
            public int getAge() {
                return age;
            }
    
            public void setAge(int age) {
                this.age = age;
            }
        }
    
  2. 假如你有如下两个jsonstring, 那么你该如何反json化成具体的Response对象呢?

    //1
    {
      "msg": "success",
      "code": "000000",
      "data": {
        "name": "java",
        "id": "123"
      }
    }
    //2
    {
      "msg": "success",
      "code": "000000",
      "data": {
        "nickname": "mars",
        "age": 15
      }
    }
    
  3. 使用fastjson

        public static void main(String[] args) {
            
            String json2 = "{\"msg\":\"success\",\"code\":\"000000\",\"data\":{\"name\":\"java\",\"id\":\"123\"}}";
            //JSON.parseObject(json2,Response<User>.class);  //由于Java的泛型-类型擦除,这么些是不行的
            Response response1 = JSON.parseObject(json2, Response.class);  //这样虽然可以反json成功,但其中的data就被转成了Object类型
            System.out.println(response1);
            System.out.println(JSON.toJSONString(response1));
        }
    

    //运行结果
    Response{msg=‘success’, code=‘000000’, data={“name”:“java”,“id”:“123”}}
    {“code”:“000000”,“data”:{“name”:“java”,“id”:“123”},“msg”:“success”}

  4. 能否强制转换为User对象呢

    public static void main(String[] args) {
            
            String json2 = "{\"msg\":\"success\",\"code\":\"000000\",\"data\":{\"name\":\"java\",\"id\":\"123\"}}";
            //JSON.parseObject(json2,Response<User>.class);  //由于Java的泛型-类型擦除,这么些是不行的
            Response response1 = JSON.parseObject(json2, Response.class);  //这样虽然可以反json成功,但其中的data就被转成了Object类型
            System.out.println(response1);
        	User data = (User) response1.getData();
            System.out.println(data.getName());
            System.out.println(JSON.toJSONString(response1));
        }
    

    //运行结果
    Response{msg=‘success’, code=‘000000’, data={“name”:“java”,“id”:“123”}}
    Exception in thread “main” java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.common.json.JsonTest$User
    at com.common.json.JsonTest.main(JsonTest.java:30)

    显然不行

  5. 那么如何反json这种泛型对象呢?——TypeReference

package com.common.json;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;

public class JsonTest {
    /*
    泛型类序列化
     */

    public static void main(String[] args) {
        
        String json2 = "{\"msg\":\"success\",\"code\":\"000000\",\"data\":{\"name\":\"java\",\"id\":\"123\"}}";
        Response<User> response = parseData(json2, new TypeReference<Response<User>>() {
        });
        System.out.println(response);
        System.out.println(JSON.toJSONString(response));

        String json3 = "{\"msg\":\"success\",\"code\":\"000000\",\"data\":{\"nickname\":\"mars\",\"age\":15}}";
        Response<Student> studentResponse = parseData(json3, new TypeReference<Response<Student>>() {
        });
        System.out.println(studentResponse);
        System.out.println(JSON.toJSONString(studentResponse));
    }

    //通用反序列化方法
    public static <Z> Z parseData(String jsonStr, TypeReference<Z> reference) {
        Z z = JSONObject.parseObject(jsonStr, reference);
        return z;
    }
}

  1. 总结
    1. TypeReference可以完成泛型类的反json化;
    2. 如果泛型类中有多个类型参数呢?又改如何处理呢?哈哈,留着以后遇到再总结。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fastjson反序列化泛型类 的相关文章

随机推荐

  • 并发编程概览

    由于内容较多 将会分成多篇文章详述 可移步查看 操作系统发展史 多道技术 进程理论 进程的并行与并发 进程的三状态 同步与异步 阻塞与非阻塞 同步异步与阻塞非阻塞 创建进程的多种方式 join方法 进程间数据默认隔离 进程间通信IPC机制
  • HashMap的十个经典问题

    整理了一些hashmap的一些经典问题 和大家分享一下 1 谈谈HashMap的一些特性 HashMap存储键值对实现快速存取 key值不可重复 但是允许为null 放在table 0 的位置 如果key值重复则覆盖 HashMap线程不安
  • 计算机科学与技术论文选题怎么选,比较好写的计算机科学与技术专业论文选题 计算机科学与技术专业论文题目如何取...

    100道 关于比较好写的计算机科学与技术专业论文选题汇总 作为大学生的毕业生应该明白了计算机科学与技术专业论文题目如何取 选一个好的题目后续的计算机科学与技术专业论文写作起来会更轻松 一 比较好写的计算机科学与技术专业论文题目 1 计算机科
  • 前端修行日记 --对象和数组的深浅拷贝方式

    对象的深浅拷贝方法 js类型介绍 首先js的数据值按照类型主要分为两大类 基本数据类型和引用数据类型 基本数据类型包括 Undefined Null Number String Boolean Symbol 引用数据类型则为Object 那
  • linux find 命令忽略某个或多个子目录的方法 【转】

    文章来源 linux find 命令忽略某个或多个子目录的方法 文章参考 使用find查找文件的时候怎么避开某个文件目录 在linux find 进行查找的时候 有时候需要忽略某些目录不查找 可以使用 prune 参数来进行过滤 但必须要注
  • Wireshark数据包分析——Teardrop泪滴攻击

    本文仅做数据包学习使用 一 泪滴攻击原理 Teardrop攻击是一种拒绝服务攻击 是一种针对IP协议的攻击方法 顾名思义 Teardrop攻击是一种令人落泪的攻击手段 可见其破坏威力很强大 它利用发送畸形数据包的方式 除此之外针对IP协议攻
  • Acwing 842. 排列数字

    dfs int u 搜索第u个位置上可以放哪个数字 include
  • linux下几种目标文件的分析

    本文中用到的命令 gcc c addvec c 生成可重定位目标文件addvec o readelf addvec o a 读取可重定位目标文件addvec o gcc O2 c main c 生成可重定位目标文件main o gcc st
  • wireshark怎么抓包和详细图文教程

    wireshark是非常流行的网络封包分析软件 功能十分强大 可以截取各种网络封包 显示网络封包的详细信息 使用wireshark的人必须了解网络协议 否则就看不懂wireshark了 为了安全考虑 wireshark只能查看封包 而不能修
  • iOS开发之内存管理

    iOS开发之内存管理 一 垃圾回收机制 二 内存管理的概念 三 OC内存管理注意事项 四 MRC相关语法 一 垃圾回收机制 与Java语言相同Objective c 2 0之后 也提供了垃圾回收机制 OC是支持垃圾回收机制的 Garbage
  • Linux运维工程师面试常用知识点总结

    Linux运维工程师面试常用知识点总结 一 Linux基础命令部分 1 查看某进程所打开的所有文件 2 添加一条静态路由 3 打包一个目录下文件 除了该目录下某个文件 4 提取本地网卡ip地址 5 如何在某个文本的每行前面添加 字符 6 c
  • XSS闯关小游戏(level1~13)

    level1 源代码 通过源代码发现此关没有对输入的name值做任何过滤 直接echo出来 寻找输入点和输出点 构造payload level2 源代码
  • Spring Boot的shiro整合(中)

    一 配置 1 MyShiroRealm类 package com wzq shiro config import javax annotation Resource import org apache shiro authc Authent
  • Logistic回归与Sigmoid函数

    一 Logistic回归 1 1 特征 Logistic回归主要是二分类预测 是对概率的估计的一种方法 概率的取值范围在 0 1 当P gt 0 5时 预测为1 当P lt 0 5时 预测为0 这也就和下文的Sigmoid 函数一样 1 2
  • 【电商下载图片插件】一键下载主图详情图的浏览器插件,现已支持京东、京东国际、淘宝、天猫、拼多多,coupang、1688、naver、gmarket、alibaba、兰亭集势等

    gao tu bao 1 介绍 搞图宝 专门获取各大电商平台详情页面主图和详情图的浏览器插件 现已支持京东 京东国际 淘宝 天猫 拼多多 coupang 1688 naver gmarket alibaba 兰亭集势 详细文档地址 http
  • spring中过滤器filter、拦截器interceptor和切面aop的基本工作原理里和执行顺序

    今天查了一下spirng中三种action前处理业务的三种方法过滤器 拦截器和切面的执行顺序记录一下 三者的区别 1 过滤器filter 过滤器是服务端的一个组件 是基于servlet实现从客户端访问服务端web资源的一种拦截机制 对请求r
  • 华为OD机试 - 寻找相同子串(Java )

    题目描述 给你两个字符串t和p 要求从t中找到一个和p相同的连续子串 并输出该子串第一个字符的下标 输入描述 输入文件包括两行 分别表示字符串t和p 保证t的长度不小于p 且t的长度不超过1000000 p的长度不超过10000 输出描述
  • Unity 处理Scene视角容易穿模问题

    问题一般有两个解决方法 1 重新进行Unity布局 右上角哪里重新进行Layout布局 一般可以恢复Scene视角相机的初始化 2 Scene视角顶部信息栏有一个摄像头图标 点开 就是可以进行Scene摄像机的控制 把Field of Vi
  • 台式机配置网站服务器,台式机搭建服务器的配置

    台式机搭建服务器的配置 内容精选 换一换 当您在升级云服务器的配置的同时 还想要将云服务器迁移到其他的AZ或Region时 您可以使用华为云的整机镜像进行迁移 迁移流程如图1所示 这里以迁移HANA数据库为例 登录管理控制台后 选择服务列表
  • fastjson反序列化泛型类

    为了代码通用 你的定义对象可能是一个泛型对象 其中可变的data属性的类型参数化 那么这个泛型类型的对象 反json化时应该注意些什么呢 Response类型 public static class Response