json反序列化时泛型处理

在对json字符串进行反序列化时,如果没有指定实体类中的泛型类型,那么反序列化出的对象对泛型内容有不同的处理:fastjson将泛型内容反序列化为它自己定义的 com.alibaba.fastjson.JSONObject;jackson反序列化为 java.util.LinkedHashMap;gson反序列化为 com.google.gson.internal.LinkedTreeMap。可见如果不进行泛型指定,反序列化出的对象交给其他的方法或接口使用时会有问题,其实常用的json处理框架对泛型都进行比较好的支持,可以在反序列化时就指定泛型的类型。下面就介绍一下如何使用:
我们需要提前定义好一些实体类。
定义泛型实体,这种实体类常用于接口返回数据:

import java.io.Serializable;public class ApiResult<T> implements Serializable {/*** 响应状态码:200-成功;其他-失败*/private int code;/*** 响应数据*/private T data;/*** 响应结果描述*/private String message = "";/*** 响应耗时:毫秒*/private long time;public ApiResult() {}public ApiResult(T data) {this.data = data;}public ApiResult(int code, T data, String message) {this.code = code;this.data = data;this.message = message;}public int getCode() {return code;}public ApiResult setCode(int code) {this.code = code;return this;}public String getMessage() {return message;}public ApiResult setMessage(String message) {this.message = message;return this;}public T getData() {return data;}public ApiResult setData(T data) {this.data = data;return this;}public long getTime() {return this.time;}public ApiResult setTime(long time) {this.time = time;return this;}/*** 成功** @return*/public static ApiResult success() {ApiResult result = new ApiResult(StatusCode.C_200.getCode(), null, StatusCode.C_200.getMessage());return result;}/*** 成功** @param data* @param <T>* @return*/public static <T> ApiResult success(T data) {ApiResult result = new ApiResult(StatusCode.C_200.getCode(), data, StatusCode.C_200.getMessage());return result;}/*** 失败** @param statusCode* @return*/public static ApiResult fail(StatusCode statusCode) {return new ApiResult().setCode(statusCode.getCode()).setMessage(statusCode.getMessage());}/*** 异常** @return*/public static ApiResult error() {return new ApiResult().setCode(StatusCode.C_ERROR.getCode()).setMessage(StatusCode.C_ERROR.getMessage());}/*** 判断响应是否为成功响应** @return*/public boolean isSuccess() {if (this.code != 200) {return false;}return true;}public static ApiResult copyCodeAndMessage(ApiResult result) {return new ApiResult().setCode(result.getCode()).setMessage(result.getMessage());}
}

定义一个状态枚举信息,将返回的所有状态都在这个枚举中列出:

/*** 状态枚举*/
public enum StatusCode {/*** 正常*/C_200(200, "success"),/*** 系统繁忙*/C_ERROR(-1, "系统繁忙"),/*** 特殊错误信息*/C_10000(10000, "特殊错误信息"),/*** 用户未登录*/C_10001(10001, "用户未登录"),/*** 用户无访问权限*/C_10003(10002, "用户无访问权限"),/*** 用户身份验证失败*/C_10004(10003, "用户身份验证失败"),/*** 请求参数错误*/C_10002(10004, "请求参数错误"),/*** 请求信息不存在*/C_10005(10005, "请求信息不存在"),/*** 更新数据失败*/C_10006(10006, "更新数据失败"),;private Integer code;private String message;StatusCode(int code, String message) {this.code = code;this.message = message;}public Integer getCode() {return code;}public String getMessage() {return message;}public static StatusCode getByCode(int code) {StatusCode[] values = StatusCode.values();for (StatusCode value : values) {if (code == value.code) {return value;}}return StatusCode.C_ERROR;}}

在定义一个类用于表示返回的数据:

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DemoVo {private int id;private String name;private String address;
}

以下所有的json反序列化操作都是基于下面的字符串:

{"code":200,"data":{"address":"guangdong-shenzhen-nanshan","id":123,"name":"xingo"},"message":"success","time":0}
  1. fastjson
    fastjson处理泛型比较简单,只需要定义需要泛型处理的 com.alibaba.fastjson.TypeReference 就可以,一段代码实现:
ApiResult<DemoVo> api = JSONObject.parseObject(json, new TypeReference<ApiResult<DemoVo>>() {});

也可以先定义一个 java.lang.reflect.Type,然后再使用这个Type:

Type type = new TypeReference<ApiResult<DemoVo>>() {}.getType();
ApiResult<DemoVo> api = JSONObject.parseObject(json, type);
  1. jackson
    jackson与fastjson类似,可以定义一个 com.fasterxml.jackson.core.type.TypeReference ,然后在反序列化时使用它:
ObjectMapper mapper = new ObjectMapper();
// 反序列化的时候如果多了其他属性,不抛出异常
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 如果是空对象的时候,不抛异常
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);// 指定引用的泛型
TypeReference<ApiResult<DemoVo>> type = new TypeReference<ApiResult<DemoVo>>(){};
ApiResult<DemoVo> api = mapper.readValue(json, type);

或者定义 com.fasterxml.jackson.databind.JavaType ,依次指定主体类class,和多个泛型类class

ObjectMapper mapper = new ObjectMapper();
// 反序列化的时候如果多了其他属性,不抛出异常
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 如果是空对象的时候,不抛异常
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);// 依次指定主体class,n个泛型class
JavaType javaType = mapper.getTypeFactory().constructParametricType(ApiResult.class, DemoVo.class);
ApiResult<DemoVo> api = mapper.readValue(json, javaType);
  1. gson
    gson处理也是类似的,需要定义一个 com.google.gson.reflect.TypeToken 并且在反序列化时使用它:
Type type = new TypeToken<ApiResult<DemoVo>>() {}.getType();
Gson gson = new GsonBuilder().create();
ApiResult<DemoVo> api = gson.fromJson(json, type);

嗯!整体来看,他们在处理泛型时都是大同小异的,在项目中选择合适的框架使用就可以。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目管理实践:如何进行项目分解?

项目管理是一个复杂的工程&#xff0c;作为项目管理者&#xff0c;项目经理应该有着统筹管理项目全局的能力。 创建一个项目计划可分为四步&#xff1a; 1、明确项目目标 项目在成立或创建之初就要有清晰明确的目标&#xff1b; 项目达到什么目的&#xff1f; 项目目标是…

Kubernetes实战(七)-反向提取镜像Dockerfile

1 概述 反向生成 Dockerfile总结了下面几个场景 : 场景一 : 在日常开发中,可以根据记录找到历史的docker镜像并进行操作&#xff0c;历史记录docker帮我们保存了&#xff0c;但是并没有一个好的方式去查看和保存构建者的Dockerfile文件内容。 场景二 : 在做优化镜像时&#x…

安美数字酒店宽带运营系统 SQL注入漏洞复现

0x01 产品简介 HiBOS酒店宽带运营系统隶属于安美世纪(北京)科技有限公司开发的一套酒店宽带管理系统。 0x02 漏洞概述 安美数字酒店宽带运营系统 online_status.php、language.php等接口处存在SQL注入漏洞,未经身份认证的攻击者可以通过此漏洞获取数据库权限,进一步利用可…

快手视频如何去掉水印?三个简单好用视频去水印方法

快手视频如何去掉水印&#xff1f;尽管新兴的短视频平台如春笋般涌现&#xff0c;吸引了众多观众在业余时间浏览和分享视频&#xff0c;快手作为当下主流短视频之一&#xff0c;许多自媒体创作者也常常会下载一些热门的视频素材进行二次编辑。然而&#xff0c;他们都可能会面临…

【超详细教程】基于html+js实现轮播图

轮播图是现代网页设计中常见的元素之一&#xff0c;它能够展示多张图片或内容&#xff0c;在有限的空间内循环播放&#xff0c;提升网页的视觉效果和用户体验。下面将以一个简单的网页轮播图为例&#xff0c;说明如何基于HTML和JavaScript实现。 ​ 1、R5Ai智能助手 chatgpt国…

揭开 Java on Azure 开发工具未来6个月路线图的神秘面纱

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 Java on Azure 工具十月份更新。在本次更新中&#xff0c;我们将分享未来几个月在 Java on Azure 开发工具方面的投资路线图。此外&…

JVM==>图解字节码指令

一&#xff0c;原始代码 我们来看一下执行这段代码的具体流程 那执行这段代码中 JVM就会把已经编译好的.class文件加载到内存中&#xff0c;交给CPU运行 1&#xff09;常量池载入运行时常量池 我们发现 10 并没有被存入常量池中&#xff0c; 这是因为short范围以内的数字不会…

如何有效进行测试执行进度计划

测试执行通常都是处于软件测试生命周期的关键路径上&#xff0c;它不仅在测试过程中占有重要的地位&#xff0c;并且也会花费大量的测试时间。针对测试执行而进行的计划&#xff0c;即测试执行进度计划&#xff0c;是进行测试执行进度控制的基础。在进行测试执行进度计划制订的…

Web APIs—介绍、获取DOM对象、操作元素内容、综合案例—年会抽奖案例、操作元素属性、间歇函数、综合案例—轮播图定时器版

版本说明 当前版本号[20231204]。 版本修改说明20231204初版 目录 文章目录 版本说明目录复习变量声明 Web APIs - 第1天笔记介绍概念DOM 树DOM 节点document 获取DOM对象案例— 控制台依次输出3个li的DOM对象 操作元素内容综合案例——年会抽奖案例操作元素属性常用属性修改…

【以太网物理层】DM9161A

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大…

我有才知识付费平台搭建,一分钟搭建你的专属知识服务平台

一站式线上线下课程传播 丰富的内容展示形式&#xff0c;满足用户不同层次的学习需求&#xff0c;提高流量转化 支持音频、视频、电子书、图文、动态等多模式课程展示形式&#xff0c;同时还支持免费、VIP会员、独立付费等多种服务方式&#xff0c;满足不同渠道场景推广&…

前端入口教程_web01

web标准 记得看&#xff01; html&#xff1a;表示整个页面 head&#xff1a; titile&#xff1a; body&#xff1a; 常用标签 1.标题标签 2.段落标签 3.换行标签 4.文本格式化标签 5. 和 标签 6.图像标签 相对路径–用来插自己本地的图片 #### 绝对路径–用来插网上找的图…

【短文】用ssh连接服务器时,怎么指定账户名

2023年12月4日&#xff0c;周一晚上 要在 SSH 连接中指定账户名&#xff0c;可以使用以下命令格式&#xff1a; ssh usernameserver_ip 其中&#xff0c;username 是要连接的服务器上的账户名&#xff0c;server_ip是服务器的 IP 地址或主机名。 例如&#xff0c;如果要使用…

天池XGBoost,重写柱状图代码

天池XGBoost 地址 重写柱状图代码&#xff1a;我没考虑复杂度&#xff0c;只考虑直观理解 原文统计地点是否降雨来画柱状图实在是太麻烦了&#xff0c;我重写了一下。最麻烦的就是数据处理。我的思路是&#xff1a; 首先取下雨的全部数据data[data[RainTomorrow] Yes] 然后…

SQL Server 数据库,创建数据表(使用T-SQL语句)

2.3表的基本概念 表是包含数据库中所有数据的数据库对象。数据在表中的组织方式与在电子表格中相似&#xff0c;都是 按行和列的格式组织的&#xff0c;每行代表一条唯一的记录&#xff0c;每列代表记录中的一个字段.例如&#xff0c;在包含公 司员工信息的表中&#xff0c;每行…

Radix Tree用法

目录 一、radix tree定义二、radix tree操作参考资料 一、radix tree定义 对于长整型数据的映射&#xff0c;如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题。 radix树就是针对这种稀疏的长整型数据查找&#xff0c;能快速且节省空间地完成映射。借助于Radix树&#x…

数组实现循环队列(增设队列大小size)

目录 一、前言 1.如何实现循环&#xff1f; 2.如何判断队列为空&#xff1f; 3.如何判断队列为满&#xff1f; 二、循环队列的结构定义 三、循环队列的创建及其初始化 四、入队 五、出队 六、取队头元素 七、取队尾元素 八、循环队列判空 九、循环队列判满 十、循环…

虾皮数据分析网站:了解Shopee市场趋势与优化运营的利器

在如今的电商时代&#xff0c;越来越多的人选择在虾皮购物&#xff08;Shopee&#xff09;平台上开设自己的店铺。然而&#xff0c;要在这个竞争激烈的市场中脱颖而出并取得成功&#xff0c;并不是一件容易的事情。为了更好地了解市场趋势、优化产品和店铺运营&#xff0c;了解…

Java面试题(每天10题)-------连载(40)

目录 Mysql篇 1、表中有大字段X&#xff08;例如&#xff1a;text类型&#xff09;&#xff0c;且字段X不会经常更新&#xff0c;将该字段拆成子表好处是什么&#xff1f; 2、Mysql中InnoDB引擎的行锁是通过加载什么上完成的&#xff1f; 3、Mysql中控制内存分配的全局参数…

功能需求与程序的关系

确定程序的输入和输出&#xff1a;根据功能需求&#xff0c;确定程序的输入数据和输出结果。这有助于我们明确程序的功能和实现方式。设计程序的算法和逻辑&#xff1a;根据功能需求&#xff0c;设计程序的算法和逻辑。这包括确定程序的数据结构、流程控制和算法实现等方面。划…