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

相关文章

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

c# checked和unchecked关键字的使用

《c#checked和unchecked关键字的使用》C#中的checked关键字用于启用整数运算的溢出检查,可以捕获并抛出System.OverflowException异常,而unchecked... 目录在 C# 中,checked 关键字用于启用整数运算的溢出检查。默认情况下,C# 的整数运算不会自

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Mybatis官方生成器的使用方式

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map... 目录1. MyBATis Generator 简介2. MyBatis Generator 的功能3

Python中使用defaultdict和Counter的方法

《Python中使用defaultdict和Counter的方法》本文深入探讨了Python中的两个强大工具——defaultdict和Counter,并详细介绍了它们的工作原理、应用场景以及在实际编... 目录引言defaultdict的深入应用什么是defaultdictdefaultdict的工作原理

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log