Gson解析json对不确定泛型的处理

Android Gson 泛型解析 解析 bean 类: public class ResponseObj<T> { private String code; private String toastMessage; private T data; public String getCode() { return code; } public voi... 阅读详情

最近项目中遇到个问题,服务端返回的json数据中,有个object中的内容是不确定的,条目不确定,key的值也不确定。我们使用的是Gson解析json。对于Gson,要把json转化为对应的实体对象,在不知道json object内部结构的情况下,这似乎不太好解决。

比如,这样的json:
"{a:1, b:'Hello,world!', c:{d:5,e:'gson'}}";
其中key c下面的object下面的元素不确定,但是解析时也不需要知道c内的具体内容,其实这个问题还是可以解决的。可以通过声明如下的实体类:

public class Bean {
    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    private int a;

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    private String b;

    public Object getC() {
        return c;
    }

    public void setC(Object c) {
        this.c = c;
    }

    private Object c;
}


将c的类型定义为Object,因为一切java object都源自Object。在解析json的代码:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String data = "{a:1, b:'Hello,world!', c:{d:5,e:'gson'}}";
        Gson gson = new Gson();
        Bean b = gson.fromJson(data, Bean.class);
        Log.e("gson", b.getC().toString());
        try {
            Log.e("gson", "111111");
            JSONObject c = new JSONObject(b.getC().toString());
            c.put("f", "json");
            Log.e("gson", c.toString());
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

或者这样:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String data = "{a:1, b:'Hello,world!', c:{d:'5',e:'gson'}}";
        Gson gson = new Gson();
        Bean b = gson.fromJson(data, Bean.class);
        Log.e("gson", b.getC().toString());
        try {
            Log.e("gson", "111111");
            LinkedTreeMap tm = (LinkedTreeMap)b.getC();
            tm.put("f", "json");
            Iterator it = tm.keySet().iterator();
            while (it.hasNext()) {
                String key = (String)it.next();
                String value = (String)tm.get(key);
                Log.e("gson", "key: " + key + ", value: " + value);
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

LinkedTreeMap,可通过key来获取value的map。与TreeMap不同的是,这类使用迭代顺序插入顺序。比较顺序只作为一个优化的有效的插入和去除。它实现了Android 4.1的TreeMap类。所以在获得object对象的时候Gson会把不同的泛型按key和value形式存储起来,使用时只需要对LinkedTreeMap进行遍历即可。


gson处理泛型的问题 工程里之前解析网络请求和做数据缓存都是用的JSONObject,手动解析数据自由度比较高。最近终于受不了一个数据要手动写半天解析过程了,决定换成用自动解析库。 现在使用的比较多的一个是谷歌的gson,一个是阿里的fast-json。网上的资料是说fast-json效率比gson高,但这个库有一些比较隐藏的坑。反正json解析慢点儿对我没什么影响,权衡之下还是打算改用gson。 gson的使用比 阅读详情

相关推荐

使用Gson解析泛型类型

在程序中访问网络的时候返回的Json有时候是固定的形式,我们所需要的json信息是以嵌套的形式给出的,比如 User info: { "result_code":"4000", "result_msg":"接受数据正常", "json_msg":{ "user_name":"jack", "user_age":15 } }Book i

SingleKnife的专栏 2540

使用Gson把json字符串转成带范型的实体类(xxBean<T>)写法

在前端项目中需要处理后端出错时的数据(也是正常的json数据),而此时在rxjava中observe只会触发onError回调,onNext根本不会走。然后我需要在onError中处理这串错误的json数据,困扰了我一段时间才正确的写出后边class对象的写法,此时使用Gson时第二个class对象的写法应当这么写: BaseBean是整个请求响应返回的json实体类,ChildBean作为范型...

qq_23404533的博客 922

使用Gson解析json数据

Gson解析系列阅读Gson使用指南使用Gson解析复杂的JSON数据使用Gson解析json数据Gson全解析搞定Gson泛型封装简单新闻客户端jsonJson 全称 JavaScript Object Natation ,用来描述数据结构,它是基于纯文本的数据格式,是一种轻量级的数据交换格式。广泛应用于服务端与客户端的数据交互。格式 Json 以key-value的形式存储数据 Key的取值为S

JackChan 4192

使用GSON和泛型解析约定格式的JSON字符串

引言 在开发过程中,我们现在绝大部分都是使用JSON格式进行数据交互,但是各个接口返回的数据内容不同,如果每个接口都进行GSON解析代码会显得比较臃肿。 背景 我们先来看一下JSON的几种基本格式: # 第一种 {"status":0,"message":"成功","data":{"age":"15","sex":"女"}} # 第二种 {"status":0,"message":"成

一花一世界的博客 757

详解Gson使用(二)带泛型的List转化

项目地址: Github:https://github.com/smileysx/GsonTest Oschina:https://git.oschina.net/ysx_xx/GsonText 详解Gson使用(一)简单对象转化 http://blog.youkuaiyun.com/a249900679/article/details/51385913 详解Gson使用(二

smile的博客 3万+

Google的GSON处理JSON解析

Google的GSON处理JSON解析 GSON是Google开发的Java API,用于转换Java对象和Json对象。本文讨论并提供了使用API的简单代码示例。 更多关于GSON的API可以访问:http://sites.google.com/site/gson/. 一、下载与安装 在使用GSON API工作之前,你需要下载库(jar文件),并将其包含到类路径中。 库,连同源

pplsunny----舞动青春 1802

使用Gson结合泛型类灵活解析JSON数据

一般比较规范的后端JSON返回数据,会遵循一些指定的JSON格式,比如: 错误: [javascript] view plain copy   {       "status": -1,       "data": null,       "err": "not_found"   }   正确:

随风而去 719

niushop靶场漏洞查找-文件上传漏洞等(超详细)

发现报错,而且这个报错十分熟悉,与我们所学的sqli报错注入特别像。这里查询到后面的url有且仅有一个,目测估计是后台。上传的图片是包含一句话木马的图片。发现获取到了webshell。实战漏洞-niushop。

qq_59020256的博客 1729

关于Gson泛型解析的解决方案。

因为最近在做Gson解析网络数据的时候遇到一个现象,当我们在服务器拿到的Json数据,一般格式都是比较统一的,只是内容有一定的变化,具体事例如下: // data 为 object 的情况 {"code":"0","message":"success","data":{}} // data 为 array 的情况 {"code":"0","message":"success","data":[]}

peakchao 1933

在没有信用卡的情况下怎么申请谷歌云(Google Cloud)?

这笔额度足够用来跑一台云服务器、部署小型网站,甚至可以尝试 AI、机器学习等项目。但问题来了——想要拿到这 300 美元,你必须先通过支付方式验证。默认选项就是绑定一张国际信用卡(Visa、MasterCard 之类),然而不少人没有信用卡,或者信用卡无法支持国际支付,结果就卡在注册第一步。很多人会疑惑:既然是送额度,为什么还要绑卡?原因其实很简单:谷歌需要确认你是真实用户,而不是批量注册薅羊毛;通过支付验证,后续如果你用完 300 美元额度,可以直接进行付费使用;

m0_74824483的博客 5654

【GPIO模拟串口通信协议】

由于这段时间搞了个安卓相关的项目,需要和安卓进行Uart通信。但是选用的芯片并没有自带uart功能,所以在充分评估项目后,考虑波特率不高的情况下,决定使用GPIO去模拟串口通信协议了。

学海无涯苦作舟 2638

Gson解析Json的方法 泛型解决方案

由于项目越来越大,dex

vivianyouyi的专栏 655

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型, API 形式 Python 调用 进行简单聊天接口测试

AGI,即通用人工智能(Artificial General Intelligence),是一种具备人类智能水平的人工智能系统。它不仅能够执行特定的任务,而且能够理解、学习和应用知识于广泛的问题解决中,具有较高的自主性和适应性。AGI的能力包括但不限于自我学习、自我改进、自我调整,并能在没有人为干预的情况下解决各种复杂问题。本节将介绍如何使用 Dify 平台调用 Ollama 部署的本地模型来创建一个聊天应用。通过 API 的方式发起聊天,可以让前端自由布置所需的聊天形式。

仙魁XAN 1万+

Gson解析时对于不确定泛型的处理

今天写一个解析时后台返回的对象不确定,不能每个对象都去写个type(如第一个代码块)去解析,因为有好多个不一样的对象,于是写了个Object fromJson2 = gson.fromJson(readContext, type);然后把object对象强转给对应的对象,结果怎么运行都不行,报 java.lang.ClassCastException: com.google.gson.inter

cheweilol的专栏 1万+

用Python turtle库 绘制皮卡丘

Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。 turtle基础知识参考: https://gitchat.blog.youkuaiyun.com/article/details/90696190 https://blog.csdn.ne...

qq_36295856的博客 2万+

DICOM标准:DICOM医学影像中的覆盖层(Overlay)概念详解

DICOM标准:深入详解DICOM医学影像中的覆盖层(Overlay)

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1562

Gson解析对象时遇到泛型的情况处理

在使用Gson解析时,遇到类型无法确定的泛型时,常常会因为遭遇泛型擦除而导致无法准确编译运行后的类型,因此,有以下方法可以防止该问题出现。

神秘人之家 401

海思图像质量之HiPQTool调试

文章目录一. HiPQTool 界面二. 图像调试三. 将调试参数写入程序中 一. HiPQTool 界面 二. 图像调试 三. 将调试参数写入程序中

lzg2011的博客 2381

GSON解析json含有不确定的泛型实体类,根据键值获取json数据

前面GSON解析json中存在不确定实体类 和GSON解析json中存在已知的不确定的泛型实体类 对于解析形如 String dataA = "{a:1, b:'Hello,world!', c:true, d:{aa:1}}"; String dataB = "{a:2, b:'Hello,world!', c:true, d:{ba:1, bb:'Hello word!'}}"; S

qq_25189723的博客 1362

vue接入海康4G版摄像头通过萤石云平台推送视频流教程

vue-video-player接入海康视频,videojs-contrib-hls,vue播放视频

renkai721的专栏 7278

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

关于json的二次解析

json字符串如下: {"data":{"deparments":[{"selected":false,"value":"1","text":"123","group":null},{"selected":false,"value":"2","text":"456","group":null...

chenliying1979的博客 639

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Gson+JsonPath+泛型 java json解析工具类

Json解析工具类完善一下,使用GSON+JsonPath+泛型来提高自己写JSON解析的效率 如下 关于JsonPath http://www.7mdm.com/1374.html https://github.com/jayway/JsonPath 为json解析轻松加上Integer Double String  List 以及 T   List的泛型功能

b275518834的专栏 6984

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android开发不得不了解的Gson泛型封装

json格式 1.后台给的数据格式有两种: // data 为 object 的情况 {"code":"0","msg":"message","success":"true","data":{}} // data 为 array 的情况 {"code":"0","msg":"message","success":"true","data":[]} 2、假定第一种的对应的Java类型为BaseBean<XXX>,第二种为BaseBean<List<XXX>>...

青冘的技术学习博客 1734

java gson解析_Gson解析泛型

做网络请求的时候肯定要封装回调,我这里就传了泛型,但是出了个问题是Gson没办法直接解析泛型,如果直接解析的话,不会得到一个javabean而是得到一个LinkedTreeMap。然后我去网上找了很就,都没有直接能把LinkedTreeMap转成javabean的方法,但是我们不可能给每个请求的结果都单独去写一个解析,这时候我们就不得不去正面一个问题:如何使用Gson来解析泛型而我这篇文章都会去围...

weixin_32691823的博客 1311

使用Gson解析Json数组遇到的泛型类型擦除问题解决方法

谷歌Gson转换Json串有如下方法: public Object fromJson(String json, Type typeOfT); 可以使用它进行数组解析。如下,使用此方法解析Json串为类型MyBean的List数组,方法可用。 List lst = new Gson().fromJson(data, new TypeToken>(){}.getType()); 但如果

submorino的专栏 5920

kotlin中Gson解析Json时对于泛型的应用

而在开发过程中,我们也可能遇到这样的Json数据//一个登陆接口返回的数据{"data"{"admin"""}//一个登陆失败的Json{"data""账号密码不匹配!"}和这样的Json数据//一个获取首页banner的Json{"data"[{"desc""我们支持订阅啦~","id""https"我们支持订阅啦~","type""https"desc""https"我们新增了一个常用导航Tab~","type""https"desc"...

张子羽的安卓bug开发日记 2073
上一篇: 外观模式
下一篇: flyweight——享元模式
hunter800421
博客等级 码龄22年 60粉丝 97原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值