Android 利用责任链模式来实现 解析不同的json对象

server/2024/11/29 2:51:25/

1. 创建解析类


class WebSocketParserChain {private val parsers = mutableListOf<WebSocketDataParser>()fun addParser(parser: WebSocketDataParser): WebSocketParserChain {parsers.add(parser)return this}fun parse(text: String): WebSocketResponseBaseBean<*>? {for (parser in parsers) {val result = parser.parse(text)if (result != null) {return result}}return null}
}/*** 解析的接口*/
interface WebSocketDataParser {fun parse(text: String): WebSocketResponseBaseBean<*>?
}/*** 对象解析*/
class DataParser : WebSocketDataParser {override fun parse(text: String): WebSocketResponseBaseBean<*>? {return try {val objectType = object : TypeToken<WebSocketResponseBaseBean<Data>>() {}.typeval webSocketBaseBean: WebSocketResponseBaseBean<*> = Gson().fromJson(text, objectType)// 如果解析后的 data 是对象(Data),直接返回结果if (webSocketBaseBean.data != null && webSocketBaseBean.data is Data) {webSocketBaseBean} else {XLog.e("DataParser----json解析对应的bean---${webSocketBaseBean.data}")null // 如果 data 不是对象,返回 null 传递给下一个解析器}} catch (e: JsonSyntaxException) {XLog.e("DataParser----json解析异常---${e.message}")null // 如果解析失败,返回 null}}
}/*** string 解析*/
class StringParser: WebSocketDataParser {override fun parse(text: String): WebSocketResponseBaseBean<*>? {return try {val stringType = object : TypeToken<WebSocketResponseBaseBean<String>>() {}.typeGson().fromJson(text, stringType)} catch (e: JsonSyntaxException) {XLog.e("StringParser-----json异常---${e.message}")null}}
}/*** object 解析  默认解析  添加一个兜底方案 避免返回的data 既不是字符串 又不是对象*/
class ObjectParser: WebSocketDataParser {override fun parse(text: String): WebSocketResponseBaseBean<*>? {return try {val stringType = object : TypeToken<WebSocketResponseBaseBean<Any>>() {}.typeGson().fromJson(text, stringType)} catch (e: JsonSyntaxException) {XLog.e("ObjectParser-----json异常---${e.message}")null}}
}

2.使用方法

 override fun onMessage(text: String) {XLog.e("onMessage----text---$text")try {val parserChain = WebSocketParserChain().addParser(DataParser())   // 尝试解析为对象类型.addParser(StringParser())   // 如果失败则尝试解析为字符串类型.addParser(ObjectParser())   // 如果失败则尝试解析为Any类型 兜底方案val webSocketBaseBean = parserChain.parse(text)XLog.e("当前websocket数据为--$webSocketBaseBean------mListener---$mListener")if (webSocketBaseBean==null) {return}// 判断 `code` 是否为 200if (webSocketBaseBean.code != 200) {return}// 回调是否初始化if (mListener == null) {return}when (webSocketBaseBean.data) {is Data -> {val updateInfo = webSocketBaseBean.data as DatamListener!!.downloadData(updateInfo)}is String -> {when (webSocketBaseBean.type) {}val downloadUrl = webSocketBaseBean.data as StringXLog.e("------downloadUrl----$downloadUrl")mListener!!.defaultRefresh()}else -> {XLog.e("解析的data---${webSocketBaseBean.data}")}}} catch (e: Exception) {XLog.e("解析异常: ${e.message}")}}

http://www.ppmy.cn/server/137649.html

相关文章

从0到1搭建flink程序-WordCount(图文/详细/mac)

目录 一、目标以及前置资料 1.1 目标 1.2 前置资料 二、实现 2.1 搭建流程 2.2 调试 参考 一、目标以及前置资料 1.1 目标 初步感受flink任务&#xff0c;从0到1快速搭建一个flink程序 1.2 前置资料 1、下载jdk&#xff1a;Mac 安装jdk_mac 安装jdk 1.8-CSDN博客 2、…

vue 果蔬识别系统百度AI识别vue+springboot java开发、elementui+ echarts+ vant开发

编号&#xff1a;R03-果蔬识别系统 简介&#xff1a;vuespringboot百度AI实现的果蔬识别系统 版本&#xff1a;2025版 视频介绍&#xff1a; vuespringboot百度AI实现的果蔬识别系统前后端java开发&#xff0c;百度识别&#xff0c;带H5移动端&#xff0c;mysql数据库可视化 1 …

Nginx负载均衡配置详解

Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;广泛用于负载均衡。它支持多种负载均衡策略&#xff0c;可以根据不同的需求进行配置。以下是 Nginx 负载均衡的详细配置和使用示例。 一、负载均衡基本概念 负载均衡是将请求分配到多个后端服务器上&#xff0c;以提高…

【Git】Git常用命令

目录 1 前言2 git命令2.1 branch2.2 checkout2.3 pull and push2.4 config2.4.1 Proxy 2.5 tag2.6 rebase2.7 patch2.8 remote2.9 submodule2.10 rm2.10 gitignore2.11 某个commit更改了哪些文件2.12 clean 3 结束语 1 前言 本章记录总结在使用git过程中常用的一些命令&#x…

适合视频搬运的素材网站推荐——短视频素材下载宝库

对于摄影爱好者和短视频创作者来说&#xff0c;找到适合搬运和创作的视频素材至关重要。无论是用于丰富画面、增加背景细节&#xff0c;还是提升作品的视觉吸引力&#xff0c;这些素材网站都能为你的创作提供极大帮助。今天&#xff0c;我将为大家推荐几个优质的素材网站&#…

C9800 bundle转换为install

1.基本说明 We recommend that you use install mode for the software upgrade. 如果模式是Bundle模式&#xff0c;可以通过如下操作转换&#xff1a; 确认如下命令&#xff1a; show version show version | include Installation mode install remove inactive 2.操作…

基于GA遗传优化的风光储微电网削峰填谷能量管理系统matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 削峰填谷的基本概念与意义 4.2 GA优化 5.完整工程文件 1.课题概述 基于GA遗传优化的风光储微电网削峰填谷能量管理系统matlab仿真。通过遗传算法优化风光储微电网的充放电控制过程&#xff0c;然后…

python opencv2

二、图像预处理 1、图像翻转 cv2.flip(src, flipCode) &#xff1a;flipCode &#xff1a;0&#xff1a;沿 X 轴翻转&#xff08;垂直翻转&#xff09;&#xff1b;1&#xff1a;沿 Y 轴翻转&#xff08;水平翻转&#xff09;&#xff0c;-1&#xff1a;沿 X 轴和 Y 轴翻转&am…