最近遇到個小問題咒唆,不是什么技術(shù)難點,但也是種思路嘛释液!分享出來給大家看看钧排。
相信大家都做過復(fù)雜類型的列表頁,一般APP的首頁都是這樣的均澳。
服務(wù)器返回的是json數(shù)據(jù),我們可以通過Fastjson或Gson直接將json字符串轉(zhuǎn)換為對應(yīng)的java bean即可符衔,java由于是強類型的找前,所以必須實現(xiàn)定義好類型,我們來看個例子:
假如服務(wù)器返回的數(shù)據(jù)是這樣的:
[
{
“type" = 1
"a" ={...}
"b" =null
"c" =null
}
{
“type" = 2
"b" ={...}
"a" =null
"c" =null
}
{
“type" = 3
"c" ={...}
"a" =null
"b" =null
}
...
]
當(dāng)然實際開發(fā)時數(shù)據(jù)要復(fù)雜得多判族。我們對應(yīng)的首頁的bean可以定義三個字段type躺盛、a、b形帮,json數(shù)據(jù)轉(zhuǎn)換為對象時槽惫,類型相對的字段就會被賦上值,列表時也可以根據(jù)類型來填充辩撑。
如果服務(wù)器返回的數(shù)據(jù)是這樣呢界斜?
[
{
"type" = 1
"data" ={...}
}
{
"type" = 3
"data" ={...}
}
{
"type" = 2
"data" ={...}
}
...
]
這種情況就尷尬了,不同類型對應(yīng)不同的bean合冀,java的列表是只允許存放相同類型數(shù)據(jù)的各薇,既然我們無法在json轉(zhuǎn)換為對象時確定data的具體類型,那么可以這樣定義bean:
class Test{
var type:Int = 0
var data:JsonObject? = null
//再定義實際類型的字段
var a:A?=null
get(){
val gson = Gson()
val jsonElement = jo!!.get("data").asJsonArray
return gson.fromJson(gson.toJson(jsonElement), object : TypeToken<A>>() {}.type)
}
var b:B?=null
get(){
val gson = Gson()
val jsonElement = jo!!.get("data").asJsonArray
return gson.fromJson(gson.toJson(jsonElement), object : TypeToken<B>>() {}.type)
}
...
}
然后你就可以拿著list:List<Test>愉快的填充列表了君躺,只要你在渲染type=1時乖乖去拿對應(yīng)的a字段就ok了峭判,其他類似开缎,當(dāng)然如果有列表的也是同理。
retrofit添加Gson轉(zhuǎn)換器直接將json轉(zhuǎn)換為對象了林螃,所以會有這種問題奕删,當(dāng)然你也可以直接根據(jù)key來操作返回的json串,方法有很多疗认,你可以選擇你喜歡的方式完残。
當(dāng)然如果你可以讓服務(wù)器哥們修改返回的數(shù)據(jù)結(jié)構(gòu)也是可以的,前提是你要和IOS組的哥們串通好侮邀,不然容易被懟坏怪。如果你要更好的方式也歡迎和我交流。
歡迎關(guān)注我的公眾號:子質(zhì)