解决Gson解析json字符串,Integer变为Double类型的问题

news2025/1/11 22:44:32

直接上代码记录下。我代码里没有Gson包,用的是nacos对Gson的封装,只是包不同,方法都一样


import com.alibaba.nacos.shaded.com.google.common.reflect.TypeToken;
import com.alibaba.nacos.shaded.com.google.gson.*;

import java.util.Map;
import java.lang.reflect.*;
import java.util.*;

public class TestJson {
    static class MapDeserializer implements JsonDeserializer<Map<String, Object>> {
        @Override
        public Map<String, Object> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            if (json.isJsonObject()) {
                JsonObject jsonObject = json.getAsJsonObject();
                Map<String, Object> map = new HashMap<>();
                for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
                    String key = entry.getKey();
                    JsonElement value = entry.getValue();
                    if (value.isJsonPrimitive() && value.getAsJsonPrimitive().isNumber()) {
                        JsonPrimitive primitive = value.getAsJsonPrimitive();
                        if (primitive.isNumber()) {
                            if (primitive.getAsString().contains(".")) {
                                map.put(key, primitive.getAsDouble());
                            } else {
                                map.put(key, primitive.getAsInt());
                            }
                        }
                    } else if (value.isJsonObject()) {
                        map.put(key, deserialize(value, typeOfT, context));
                    } else if (value.isJsonArray()) {
                        map.put(key, processList(value.getAsJsonArray(), context));
                    } else if (value.isJsonNull()) {
                        map.put(key, null);
                    } else {
                        throw new JsonParseException("Unsupported value type: " + value.getClass());
                    }
                }
                return map;
            } else {
                throw new JsonParseException("Expected JsonObject, but got: " + json.getClass());
            }
        }

        private List<Object> processList(JsonArray array, JsonDeserializationContext context) {
            List<Object> list = new ArrayList<>();
            for (JsonElement element : array) {
                if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber()) {
                    JsonPrimitive primitive = element.getAsJsonPrimitive();
                    if (primitive.isNumber()) {
                        if (primitive.getAsString().contains(".")) {
                            list.add(primitive.getAsDouble());
                        } else {
                            list.add(primitive.getAsInt());
                        }
                    }
                } else if (element.isJsonObject()) {
                    list.add(deserialize(element, null, context));
                } else if (element.isJsonArray()) {
                    list.add(processList(element.getAsJsonArray(), context));
                } else if (element.isJsonNull()) {
                    list.add(null);
                } else {
                    throw new JsonParseException("Unsupported value type: " + element.getClass());
                }
            }
            return list;
        }
    }

    class BkR<T> {
        private boolean result;
        private T data;

        public boolean isResult() {
            return result;
        }

        public void setResult(boolean result) {
            this.result = result;
        }

        public T getData() {
            return data;
        }

        public void setData(T data) {
            this.data = data;
        }
    }

    public static void main(String[] args) {
        String json = "{\"result\": true, \"data\": {\"aaa\":1, \"bbb\":{\"ab\":[{\"a\":1},{\"a\":2}],\"ccc\":{\"bdd\":[111,222,333,444]}}}}";
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(new TypeToken<Map<String, Object>>() {}.getType(), new MapDeserializer())
                .create();

        BkR<Map<String, Object>> bkr = gson.fromJson(json, new TypeToken<BkR<Map<String, Object>>>() {}.getType());
        System.out.println(bkr);
    }
}

输出信息:

在这里插入图片描述

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

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

相关文章

经典CNN(一):ResNet-50算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 ResNet理论 深度残差网络ResNet(deep residual network)在2015年由何凯明等提出&#xff0c;因为它简单与实用并存&#xff0c;随后很多研究…

Hutool工具类 -集常用工具类为一体 - 工具类之大成

文章目录 说在前面的话简介gitee介绍项目介绍 网址gtiee 网址github 网址 安装pom依赖引入 &#xff1a;下载jar 文档中文文档中文备用文档参考API视频介绍 部分截图首页包含组件(总)IO流相关部分工具类(Util)集合类HTTP客户端 功能不再一一赘述和截图&#xff0c;具体请查看官…

详解TCP协议

TCP协议段格式 序号和确认序号&#xff1a;在真实服务器和客服端通信过程中请求是并行执行的&#xff0c;这会导致到达是乱序的&#xff0c;所以才会有序号这个东西&#xff0c;确认序号是对方应答时返回的&#xff0c;例如序号发送到1&#xff0c;确认序号会返回2&#xff0c;…

计算机网络 day6 arp病毒 - ICMP协议 - ping命令 - Linux手工配置IP地址

目录 arp协议 arp病毒\欺骗 arp病毒的运行原理 arp病毒产生的后果&#xff1a; 解决方法&#xff1a; ICMP协议 ICMP用在哪里&#xff1f; ICMP协议数据的封装过程 ​编辑 为什么icmp协议封装好数据后&#xff0c;还要加一个ip包头&#xff0c;再使用ip协议再次进…

springboot农机电招平台

本系统为了数据库结构的灵活性所以打算采用MySQL来设计数据库&#xff0c;而java技术&#xff0c;B/S架构则保证了较高的平台适应性。本文主要介绍了本系统的开发背景&#xff0c;所要完成的功能和开发的过程&#xff0c;主要说明了系统设计的重点、设计思想。 本系统主要是设…

关于java垃圾回收的小结

一、为什么要有垃圾回收 我们每次创建对象都需要在栈上开辟空间&#xff0c;堆上使用内存&#xff0c;如果我们只是开辟了这个空间&#xff0c;而不去释放他&#xff0c;那么再大的内存和空间也会有满的一天&#xff0c;所以我们在Java中引入了GC&#xff08;垃圾回收机制&…

Foxit PDF ActiveX 5.9.8 Crack

Foxit PDF SDK ActiveX 即时添加PDF显示功能至Windows应用程序&#xff0c;快速投放市场&#xff0c;可视化编程组件功能强大且易于使用的PDF软件开发工具包 对于刚接触PDF或不愿投入过多精力学习PDF技术的产品管理者及开发者来说&#xff0c;Foxit PDF SDK ActiveX无疑是理想…

中国1km分辨率逐月平均气温数据集(1901-2022)

时间分辨率月空间分辨率1km - 10km共享方式开放获取数据大小9.71 GB数据时间范围 1901.1-2022.12 数据集摘要 该数据为中国逐月平均温度数据,空间分辨率为0.0083333(约1km),时间为1901.1-2022.12。数据格式为NETCDF,即.nc格式。数据单位为0.1 ℃。该数据集是根据CRU发布的…

对Vue组件化开发思想的一些理解

目录 组件的分类 为什么需要组件化开发 如何设计组件 组件间通信 组件系统是 Vue的一个重要概念&#xff0c;让我们可以用独立可复用的小组件来构建大型应用。几乎任意类型的应用的界面都可以抽象为一个组件树&#xff1a; 写一个 Vue 项目&#xff0c;其实就是在写一个个的…

接口测试 react+unittest+flask 接口自动化测试平台

目录 1 前言 2 框架 2-1 框架简介 2-2 框架介绍 2-3 框架结构 3 平台 3-1 平台组件图 1 新建用例 2 生成测试任务 3 执行并查看测试报告 3-2 用例管理 3-2-1 用例设计 3-3 任务管理 3-3-1 创建任务 3-3-2 执行任务 3-3-3 测试报告 3-3-4 邮件通知 1 前言 构建…

idea新建xml模板设置,例如:mybatis-config

在idea怎么新建mapper.xml文件&#xff0c;具体操作步骤和结果如下&#xff0c;其他文件也是可以自定义模板的流程和步骤一致&#xff01; 效果如下&#xff1a; 步骤如图&#xff1a; step1&#xff1a; step2&#xff1a; 文件内容&#xff1a; <?xml version"…

Android.mk 文件使用解析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Android.mk 简介二、Android.mk 的基本格式三、Android.mk 深入学习一四、 Android.mk 深入学习二五、 Android.mk 深入学习三六、 Android.mk 判断…

C++【哈希表的模拟实现】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 &#x1f307;前言&#x1f3d9;️正文1、模拟实现哈希表&#xff08;闭散列&#xff09;1.1、存储数据结构的定义1…

MySQL函数以及存储过程

创建表并插入数据‘ 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) 否 否 是 否 否 glass VARCHAR(50) 否 否 是 否 否 sch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun glass 2 mysql> select * from sch; -------------------…

火车头采集器下载中文图片地址报错:发生错误终止..

火车头采集器下载中文图片地址报错&#xff1a;发生错误终止.. 报错信息 该问题时网友发现的&#xff0c;采集的内容中图片URL地址包含中文字符。 然后在采集内容时火车头自动下载图片就提示&#xff1a;发生错误终止&#xff0c;远程服务器返回错误&#xff1a;&#xff08…

MySQL 主从延迟的常见原因及解决方法

主从延迟作为 MySQL 的痛点已经存在很多年了&#xff0c;以至于大家都有一种错觉&#xff1a;有 MySQL 复制的地方就有主从延迟。 对于主从延迟的原因&#xff0c;很多人将之归结为从库的单线程重放。 但实际上&#xff0c;这个说法比较片面&#xff0c;因为很多场景&#xf…

我司的短信接口被刷了

如何发现的 成本分摊系统&#xff0c;将成本分摊给业务部门时&#xff0c;业务部门对账&#xff0c;发现某一类型的短信用量上涨了100多倍 排查调用来源时&#xff0c;发现来源为C端用户&#xff0c;由于调用量异常高&#xff0c;业务反馈近期无活动&#xff0c;因此怀疑被刷…

GAMES101 作业0

Visual Studio 2019下环境配置 课上提供的环境是Linux, 还需要安装Vitrual Box和创建虚拟机&#xff0c;省事就直接在Windows系统下Visual Studio下操作了。 简单的环境配置&#xff1a; 下载Eigen 的库在工程属性中添加目录&#xff1a; 2处地方 注意&#xff1a; 刚添加完…

CONTAINER = ALL是ALTER USER语句的默认值

连接到root时查看有关root&#xff0c;CDB和PDB的数据 当公用用户执行查询时&#xff0c;可以限制X $表和V $&#xff0c;GV $和CDB_ *视图的视图信息。X$表和这些视图包含有关应用程序root及其关联应用程序PDB的信息&#xff0c;或者如果连接到CDB root&#xff0c;则是整个C…

基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…