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

打印 上一主题 下一主题

主题 1716|帖子 1716|积分 5148

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 创建剖析类

  1. class WebSocketParserChain {
  2.     private val parsers = mutableListOf<WebSocketDataParser>()
  3.     fun addParser(parser: WebSocketDataParser): WebSocketParserChain {
  4.         parsers.add(parser)
  5.         return this
  6.     }
  7.     fun parse(text: String): WebSocketResponseBaseBean<*>? {
  8.         for (parser in parsers) {
  9.             val result = parser.parse(text)
  10.             if (result != null) {
  11.                 return result
  12.             }
  13.         }
  14.         return null
  15.     }
  16. }
  17. /**
  18. * 解析的接口
  19. */
  20. interface WebSocketDataParser {
  21.     fun parse(text: String): WebSocketResponseBaseBean<*>?
  22. }
  23. /**
  24. * 对象解析
  25. */
  26. class DataParser : WebSocketDataParser {
  27.     override fun parse(text: String): WebSocketResponseBaseBean<*>? {
  28.         return try {
  29.             val objectType = object : TypeToken<WebSocketResponseBaseBean<Data>>() {}.type
  30.             val webSocketBaseBean: WebSocketResponseBaseBean<*> = Gson().fromJson(text, objectType)
  31.             // 如果解析后的 data 是对象(Data),直接返回结果
  32.             if (webSocketBaseBean.data != null && webSocketBaseBean.data is Data) {
  33.                 webSocketBaseBean
  34.             } else {
  35.                 XLog.e("DataParser----json解析对应的bean---${webSocketBaseBean.data}")
  36.                 null // 如果 data 不是对象,返回 null 传递给下一个解析器
  37.             }
  38.         } catch (e: JsonSyntaxException) {
  39.             XLog.e("DataParser----json解析异常---${e.message}")
  40.             null // 如果解析失败,返回 null
  41.         }
  42.     }
  43. }
  44. /**
  45. * string 解析
  46. */
  47. class StringParser: WebSocketDataParser {
  48.     override fun parse(text: String): WebSocketResponseBaseBean<*>? {
  49.         return try {
  50.             val stringType = object : TypeToken<WebSocketResponseBaseBean<String>>() {}.type
  51.             Gson().fromJson(text, stringType)
  52.         } catch (e: JsonSyntaxException) {
  53.             XLog.e("StringParser-----json异常---${e.message}")
  54.             null
  55.         }
  56.     }
  57. }
  58. /**
  59. * object 解析  默认解析  添加一个兜底方案 避免返回的data 既不是字符串 又不是对象
  60. */
  61. class ObjectParser: WebSocketDataParser {
  62.     override fun parse(text: String): WebSocketResponseBaseBean<*>? {
  63.         return try {
  64.             val stringType = object : TypeToken<WebSocketResponseBaseBean<Any>>() {}.type
  65.             Gson().fromJson(text, stringType)
  66.         } catch (e: JsonSyntaxException) {
  67.             XLog.e("ObjectParser-----json异常---${e.message}")
  68.             null
  69.         }
  70.     }
  71. }
复制代码
2.利用方法

  1. override fun onMessage(text: String) {
  2.         XLog.e("onMessage----text---$text")
  3.         try {
  4.             val parserChain = WebSocketParserChain()
  5.                 .addParser(DataParser())   // 尝试解析为对象类型
  6.                 .addParser(StringParser())   // 如果失败则尝试解析为字符串类型
  7.                 .addParser(ObjectParser())   // 如果失败则尝试解析为Any类型 兜底方案
  8.             val webSocketBaseBean = parserChain.parse(text)
  9.             XLog.e("当前websocket数据为--$webSocketBaseBean------mListener---$mListener")
  10.             if (webSocketBaseBean==null) {
  11.                 return
  12.             }
  13.             // 判断 `code` 是否为 200
  14.             if (webSocketBaseBean.code != 200) {
  15.                 return
  16.             }
  17.             // 回调是否初始化
  18.             if (mListener == null) {
  19.                return
  20.             }
  21.             when (webSocketBaseBean.data) {
  22.                 is Data -> {
  23.                     val updateInfo = webSocketBaseBean.data as Data
  24.                     mListener!!.downloadData(updateInfo)
  25.                 }
  26.                 is String -> {
  27.                     when (webSocketBaseBean.type) {
  28.                     }
  29.                     val downloadUrl = webSocketBaseBean.data as String
  30.                     XLog.e("------downloadUrl----$downloadUrl")
  31.                     mListener!!.defaultRefresh()
  32.                 }
  33.                 else -> {
  34.                     XLog.e("解析的data---${webSocketBaseBean.data}")
  35.                 }
  36.             }
  37.         } catch (e: Exception) {
  38.             XLog.e("解析异常: ${e.message}")
  39.         }
  40.     }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表