JSON字符串转泛型对象

news2024/11/18 16:41:15

JSON字符串转泛型对象

以下问题只仅限于博主自身遇到,不代表绝对出现问题

相关类展示:

参数基类

public class BaseParams {
}

基类

public abstract class AbstractPush<Params extends BaseParams> {


    protected abstract void execute(Params params);

    public void push(String json){
        //todo 分fastjson和fastjson2说明
    }

}

测试类

public class TestPush extends AbstractPush<TestParams>{

    @Override
    protected void execute(TestParams params) {
        System.out.println("params = " + params);
    }
}

测试类的泛型参数

import lombok.Data;

@Data
@Accessors(chain = true)
public class TestParams extends BaseParams{

    private String name;
    private String sex;
    private Integer age;
}

错误案例

不能如下案例这样使用,在FastJson中,写法不报红;在FastJson2中,写法报红

基类#push(String)

public void push(String json){
    Type type = ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    Params params = JSONObject.parseObject(json, new TypeReference<Params>(type) {
    });
    this.execute(params);
}

入口类

public class TestFunction {

    public static void main(String[] args) {
        TestPush testPush = new TestPush();

        TestParams testParams = new TestParams();
        testParams.setName("张三").setSex("男").setAge(10);

        testPush.push(JSON.toJSONString(testParams));
    }
}

执行结果:
在这里插入图片描述

参考网上资料(文末有说明),改进版

使用FastJson去按照以下案例处理,会在对象转JSON时(JSON.toJSONString),转化结果为{};使用FastJson2在不使用Feature配置项也返回{}。只有当配置了Feature才会返回私有属性。

后续博主也无法复现,故在使用TypeReference最好使用FastJson2,且使用Feature配置项来保证不会出现意外情况

转换类(新增)

@Data
public class Convertor<Params extends BaseParams> {

    private Params params;


}

基类#push(String)

public void push(String json){
    Type type = ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    Convertor<Params> convertor = JSONObject.parseObject(json, new TypeReference<Convertor<Params>>(type) {},
            JSONReader.Feature.FieldBased);
    this.execute(convertor.getParams());
}

JSONReader.Feature.FieldBased:基于字段反序列化,如果不配置,会默认基于public的field和getter方法序列化。配置后,会基于非static的field(包括private)做反序列化。在fieldbase配置下会更安全

入口类

public class TestFunction {

    public static void main(String[] args) {
        TestPush testPush = new TestPush();

        Convertor<TestParams> convertor = new Convertor<>();

        TestParams testParams = new TestParams();
        testParams.setName("张三").setSex("男").setAge(10);

        convertor.setParams(testParams);

        String s = JSON.toJSONString(convertor, JSONWriter.Feature.FieldBased);
        testPush.push(s);
    }
}

执行结果:
在这里插入图片描述

参考:

fastJSON,使用TypeReference处理复杂的泛型对象

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

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

相关文章

Shell数组函数:数组——数组和循环(四)

使用数组统计&#xff0c;用户shell的类型和数量 一、脚本编辑 [root192 ~]# vim shell.sh #!/bin/bash declare -A shells while read ii dotypeecho $ii | awk -F: {print $7}let shells[$type] done < /etc/passwdfor i in ${!shells[]} doecho "$i: ${shells[$i]…

开源电子合同签署平台小程序源码/电子文件签字+在线合同签署系统源码/电子合同小程序源码

源码简介&#xff1a; 开源电子合同签署平台小程序源码&#xff0c;它是电子文件签字在线合同签署系统源码/电子合同小程序源码 目前商业端和开源端一致&#xff0c;免费开源状态&#xff01; 聚合市场上各类电子合同解决方案商&#xff0c;你无需一个一个的对接电子合同厂商…

<JavaEE> 经典设计模式之 -- 线程池

目录 一、线程池的概念 二、Java 标准库中的线程池类 2.1 ThreadPoolExecutor 类 2.1.1 corePoolSize 和 maximumPoolSize 2.1.2 keepAliveTime 和 unit 2.1.3 workQueue 2.1.4 threadFactory 2.1.5 handler 2.1.6 创建一个参数自定义的线程池 2.2 Executors 类 2.3…

前端开发_移动Web+动画

平面转换 作用&#xff1a;为元素添加动态效果&#xff0c;一般与过渡配合使用 概念&#xff1a;改变盒子在平面内的形态&#xff08;位移、旋转、缩放、倾斜&#xff09; 平面转换又叫 2D 转换 平移 属性&#xff1a;transform: translate(X轴移动距离&#xff0c;Y轴移动…

vue2 cron表达式组件

vue2 cron表达式组件 1. 先上图 2. 代码目录 3. 直接上代码 &#xff08;组件代码太多&#xff0c;直接上压缩包&#xff0c;解压后直接用&#xff0c;压缩包再博客顶部&#xff09; 4. 使用注&#xff1a;示例代码中使用了element-ui // HomeView.vue<template><…

Python如何实现性能自动化测试

一、思考 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈 自动化测试 使用程序代替手工提升测试效率 性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能…

多任务学习(Multi-Task Learning)和迁移学习(Transfer Learning)的详细解释以及区别(系列1)

文章目录 前言一、多任务学习&#xff08;Multi-Task Learning&#xff09;是什么&#xff1f;二、多任务学习&#xff08;Multi-Task Learning&#xff09;对数据的要求三、迁移学习是什么&#xff1f;四&#xff0c;迁移学习对数据的要求五&#xff0c;多任务学习与迁移学习的…

LeetCode Hot100 22.括号生成

题目&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 方法&#xff1a;灵神 组合型回溯-剪枝-枚举填左括号还是右括号 代码&#xff1a; class Solution {private int n;private char[] pat…

放弃原生SQL:Python中更优雅的数据库操作

概要 在Python中&#xff0c;通过原生SQL语句进行数据库操作是一种传统的方式&#xff0c;但现代的Python开发中&#xff0c;使用ORM&#xff08;Object-Relational Mapping&#xff09;工具和数据库连接库可以更加高效和优雅地进行增删改查操作。本文将详细介绍Python中放弃原…

Ubuntu 18.04使用Qemu和GDB搭建运行内核的环境

安装busybox 参考博客&#xff1a; 使用GDBQEMU调试Linux内核环境搭建 一文教你如何使用GDBQemu调试Linux内核 ubuntu22.04搭建qemu环境测试内核 交叉编译busybox 编译busybox出现Library m is needed, can’t exclude it (yet)的解释 S3C2440 制作最新busybox文件系统 https:…

vue,nvue,uniapp,到底是什么

vue,nvue,uniapp,到底是什么&#xff1f; 发展猜想&#xff1a; 开发移动端软件&#xff0c;一般是控件逻辑&#xff0c;可拖动控件android studio都给你设计好了。 开发web页面时&#xff0c;用vue&#xff0c;vue是前端框架。主要是终端设备通过浏览器进行访问&#xff08…

第三节JavaScript 函数、作用域、事件、字符串、运算符、比较

一、JavaScript的作用域 1、变量在函数内声明&#xff0c;变量为局部变量&#xff0c;具有局部的作用域。 局部变量&#xff1a;只能在函数内部访问 示例&#xff1a; // 此处不能调用 carName 变量 function myFunction() { var carName "Volvo"; // 函数内可…

Unirest-Java:Java发起GET、POST、PUT、DELETE、文件上传,文件下载工具类介绍

一、简介 Unirest-Java是一个轻量级的HTTP客户端库&#xff0c;用于在Java应用程序中发送HTTP请求。 它提供了简单易用的API&#xff0c;可以方便地处理GET、POST、PUT、DELETE等HTTP方法。 Unirest-Java支持异步和同步请求&#xff0c;可以轻松地与JSON、XML等数据格式进行…

MongoDB的条件操作符

本文主要介绍MongoDB的条件操作符。 目录 MongoDB条件操作符1.比较操作符2.逻辑操作符3.元素操作符4.数组操作符5.文本搜索操作符 MongoDB条件操作符 MongoDB的条件操作符主要分为比较操作符、逻辑操作符、元素操作符、数组操作符、文本搜索操作符等几种类型。 以下是这些操作…

使用医学数据集MIMIC,常见的问题记录

目录 MIMIC数据库安装及数据导入教程1.postgresql安装第一步&#xff1a;error running考虑到是不是不同的sql的冲突从报错信息出发重启之后可以安装了 2.打开navicate153.7z 不是内部或外部命令&#xff0c;也不是可运行的程序4.在postgreSQL中输入**\i xxx**命令后遇到提示pe…

idea__SpringBoot微服务06——静态资源(新依赖),首页和图标定制

静态资源 一、静态资源二、首页和图标定制————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢谢~~ 新依赖&#xff1a;jquery的 <dependency><groupId>org.webjars&…

阿里云SLS采集jvm日志

一、背景 java应用部署在阿里云的k8s容器里&#xff0c;采集其日志的需求则是一个不可缺少的。而不同公司的jvm日志会存在很大的差异&#xff0c;所以本文仅以我的实际情况作一个示例&#xff0c;仅供有需要采集jvm日志的同学们一个参考。 我们打印的Jvm日志格式见下&#xf…

基于JAVA+SpringBoot+Vue的前后端分离的医院信息智能化HIS系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着科技的不断发展&a…

Gson 自动生成适配器插件

在json解析方面 我们常见有下面几方面困扰 1. moshi code-gen能自动生成适配器,序列化效率比gson快,但是自定义程度不如gson,能java kotlin共存 且解决了默认值的问题 2.gson api 强大自由,但是 第一次gson的反射缓存比较慢,而且生成对象都是反射,除非主动注册com.google.gson…

maven下载安装与配置

文章目录 1. Maven下载2. 配置settings.xml2.1 指定Maven的本地仓库2.2 配置阿里云提供的镜像仓库2.3 配置 Maven 工程的基础 JDK 版本 3. 配置环境变量3.1 检查 JAVA_HOME 配置是否正确3.2 配置 MAVEN_HOME3.3 配置PATH3.4 验证 1. Maven下载 【Maven官网地址】 【Maven下载…