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

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>>() {}.type
            val 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>>() {}.type
            Gson().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>>() {}.type
            Gson().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` 是否为 200
            if (webSocketBaseBean.code != 200) {
                return
            }

            // 回调是否初始化
            if (mListener == null) {
               return
            }

            when (webSocketBaseBean.data) {
                is Data -> {
                    val updateInfo = webSocketBaseBean.data as Data
                    mListener!!.downloadData(updateInfo)
                }

                is String -> {
                    when (webSocketBaseBean.type) {

                    }
                    val downloadUrl = webSocketBaseBean.data as String
                    XLog.e("------downloadUrl----$downloadUrl")
                    mListener!!.defaultRefresh()
                }

                else -> {
                    XLog.e("解析的data---${webSocketBaseBean.data}")
                }
            }
        } catch (e: Exception) {
            XLog.e("解析异常: ${e.message}")
        }

    }
相关推荐
每次的天空1 小时前
Kotlin 内联函数深度解析:从源码到实践优化
android·开发语言·kotlin
练习本2 小时前
Android MVC架构的现代化改造:构建清晰单向数据流
android·架构·mvc
早上好啊! 树哥2 小时前
android studio开发:设置屏幕朝向为竖屏,强制应用的包体始终以竖屏(纵向)展示
android·ide·android studio
YY_pdd3 小时前
使用go开发安卓程序
android·golang
Android 小码峰啊5 小时前
Android Compose 框架物理动画之捕捉动画深入剖析(29)
android·spring
bubiyoushang8885 小时前
深入探索Laravel框架中的Blade模板引擎
android·android studio·laravel
cyy2985 小时前
android 记录应用内存
android·linux·运维
CYRUS STUDIO5 小时前
adb 实用命令汇总
android·adb·命令模式·工具
这儿有一堆花5 小时前
安卓应用卡顿、性能低下的背后原因
android·安卓
byte轻骑兵5 小时前
【Bluedroid】蓝牙HID DEVICE断开连接流程源码分析
android·c++·蓝牙·hid·bluedroid