android后端返回json,后端返回json相同字段,类型不同的处理方式(retrofit+gson)...

方法有很多,你可以自己拿responseBody里的json,一个个字段自己解析;也可以给okhttp添加拦截器来处理response内容。

这里提供一种简便的方法。

Gson在反序列化的时候,默认是将{}转成LinkedTreeMap,[] 转成ArrayList,value是数字的全部定义为了double。

如果后端返回格式不规矩或者会变化的时候,将bean里定义的是Any或*即可

比如有时返回的是这样

ab3161a871d9

image.png

有时是这样

ab3161a871d9

image.png

可以看到event虽然都是个数组,可里面的内容完全就不一样,于是我就定义俩个data class,分别为ZulipMessage和DelMsgEventDTO

data class ZulipEventDTO(

val events: List>

)

event定义是一个集合,泛型就是Gson默认的LinkedTreeMap,这样不管是那种数据都可以接受到。并且存入map中。

解析的时候,根据event.type的类型,解析成不同的类。

private val parseMapGson = GsonBuilder().enableComplexMapKeySerialization().create() //重点行

eventDTO.events.forEach { event ->

when (event["type"]) {

//根据type类型,解析成不同的类

ZulipConst.EVENT_TYPE_MESSAGE -> {

val messageJson = parseMapGson.toJson(event[ZulipConst.EVENT_TYPE_MESSAGE]) // 先将LinkedList转成json

val zulipMessage = parseMapGson.fromJson(messageJson, ZulipMessage::class.java) //再根据类型转成bean对象

saveMsg2Database(zulipMessage)

}

ZulipConst.EVENT_TYPE_DELETE_MESSAGE -> {

val messageJson = parseMapGson.toJson(event[ZulipConst.EVENT_TYPE_DELETE_MESSAGE])

val delMsgEventDTO = parseMapGson.fromJson(messageJson, DelMsgEventDTO::class.java)

delMsgFromDb(delMsgEventDTO)

}

else -> {

}

}

// Any被转成LinkedTreeMap时,所有数字都是double

val eventId = (event["id"] as Double).toLong()

if (eventId > lastEventId) {

lastEventId = eventId

}

}

总结:有type能帮忙判断返回数据类型的,那就根据类型定义不同的类,先用LinkedTreeMap接住数据,再根据类型转就是了。

如果没有type这种字段,完全无法预料返回的是个什么,那不妨就从LinkedTreeMap中直接取数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值