Android 使用Gson解析json不固定key(二)

2024-06-01 15:32

本文主要是介绍Android 使用Gson解析json不固定key(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

闲来无事分析一下Android在开发中,后台传来的数据需要回传给后台时,为什么需要明确key?

项目中使用的是Gson框架。
先来看看Person是怎么写的,常规写法,没毛病

public class Person implements Serializable {private String name;private Param param;public String getName() {return name;}public void setName(String name) {this.name = name;}public  class Param implements Serializable {private String id;public String getId() {return id;}public void setId(String id) {this.id = id;}}
}

再看一下请求,没异议

//界面数据-请求A接口
HttpRequestPresenter.getInstance().post(getActivity(), true, url_a, null, new IRequestCallBack() {@Overridepublic void success(String data, String msg) {//json{ "name":"fly","param": {"id":1}}Gson gson = new Gson();mPerson = gson.fromJson(data, Person.class);}@Overridepublic void failed(int errorCode, String msg, String data, String code) {}
});//把param中的数据回传-请求B接口
HashMap map = new HashMap();
map.put("id", String.valueOf(mPerson.param.id));
HttpRequestPresenter.getInstance().post(getActivity(), true, url_b, map, new IRequestCallBack() {@Overridepublic void success(String data, String msg) {}@Overridepublic void failed(int errorCode, String msg, String data, String code) {}
});

param在项目中协定为请求某接口所需参数,其中的内容参数无需知道,只需请求接口时,原封不动的再传给后台。

那么问题来了,如果在param中参数不固定的时候怎么办呢?
假如需求突然变了,请求B接口需要加一个参数comment,后台在A接口返回的param中新加了参数comment,此时此刻以上的代码就不对了。

这种情况为什么不能做成动态的呢?为什么不摒弃Gson的快捷应用,非得找后台加参数时要提前声明?

以下为我尝试解决这种情况的一种方法
前提我们已经协定了param是动态互传的,可以直接把param的类型改成HashMap。

public class Person implements Serializable {private String name;private HashMap<String, String> param;public String getName() {return name;}public void setName(String name) {this.name = name;}public void setParam(HashMap<String, String> param) {this.param = param;}public HashMap<String, String> getParam() {return param;}
}
//界面数据-请求A接口
HttpRequestPresenter.getInstance().post(getActivity(), true, url_a, null, new IRequestCallBack() {@Overridepublic void success(String data, String msg) {//json{ "name":"fly","param": {"id":1,"comment":"test"}}Gson gson = new Gson();mPerson = gson.fromJson(data, Person.class);}@Overridepublic void failed(int errorCode, String msg, String data, String code) {}
});//把param中的数据回传-请求B接口
HashMap map = mPerson.getParam();
HttpRequestPresenter.getInstance().post(getActivity(), true, url_b, map, new IRequestCallBack() {@Overridepublic void success(String data, String msg) {}@Overridepublic void failed(int errorCode, String msg, String data, String code) {}
});

就算其他地方需要使用param中的某个参数,也可以get到,不是非得使用对象点变量吧

HashMap map = mPerson.getParam();
String comment = map.get("comment").toString();

这么做有什么不好吗?

还遇到过一种情况
record中key是不固定的,value是固定结构。那我们可以把value的固定结构写出来,用的时候可以非常便捷。

{"name":"fly","param": {"id":1},"record":{"20190801":{"type":"a"},"20190802":{"type":"b"},"20190803":{"type":"c"}}
}
public class Person implements Serializable {private String name;private Param param;private HashMap<String, Record> record;public String getName() {return name;}public void setName(String name) {this.name = name;}public  class Param implements Serializable {private String id;public String getId() {return id;}public void setId(String id) {this.id = id;}}public  class Record implements Serializable {private String type;public String getType() {return type;}public void setType(String type) {this.type = type;}}
}
HttpRequestPresenter.getInstance().post(getActivity(), true, url_a, null, new IRequestCallBack() {@Overridepublic void success(String data, String msg) {Gson gson = new Gson();Person mPerson = gson.fromJson(data, Person.class);Map<String, Record> record = mPerson.getRecord();//一、遍历取出keyfor (String key:record.keySet()){Record value = record.get(key);String type = value.getType().toString();}//二、遍历取出键值对for (Map.Entry<String,Record> pair:record.entrySet()){String key = pair.getKey();Record value = pair.getValue();String type = value.getType().toString();} }@Overridepublic void failed(int errorCode, String msg, String data, String code) {}
});

另一种情况

{"data":{"1":"数字1","2":"数字2","3":"数字3"}
}
HttpRequestPresenter.getInstance().post(getActivity(), true, url_a, null, new IRequestCallBack() {@Overridepublic void success(String data, String msg) {Gson gson = new Gson();Map<String, Object> ps = gson.fromJson(data, new TypeToken<Map<String, Object>>(){}.getType());for (Map.Entry<String,Object> pair:ps.entrySet()){String key = pair.getKey();Record value = pair.getValue();String type = value.getType().toString();} }@Overridepublic void failed(int errorCode, String msg, String data, String code) {}
});

这篇关于Android 使用Gson解析json不固定key(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021397

相关文章

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.