在實際開發(fā)中藻雪,現(xiàn)在安卓端和后臺之間的數(shù)據(jù)交互饲宿,一般都是用JSON來傳遞數(shù)據(jù)信息。JSON大家一般都比較熟悉迈勋。我這邊就以實際項目中的后臺傳過來的情況和大家分析下及如何處理炬灭。
比如后臺返回一個交易查詢:
我們看到這個列表本身要按月份來進行分類。然后月份里面再是具體的一項項記錄靡菇。
這里我們分二種后臺傳給你的JSON格式情況講解下:(重點是第二種情況)
普通格式
一般來說后臺會根據(jù)這個需求傳遞相關JSON:
比如后臺一般這么發(fā)給你:
{
"success": true,
"msg": "用戶查詢訂單成功",
"obj": [
{
"month": {
"date": "09月",
"list": [
{
"companyName": "寧波心科技有限公司",
"createDate": "2016.09.14 17:35:45",
"money": "5000",
"type": "2"
},
{
"companyName": "湖南省林森科技有限公司",
"createDate": "2016.09.10 17:35:45",
"money": "5900",
"type": "2"
}
]
}
},
{
"month": {
"date": "11月",
"list": [
{
"companyName": "杭州心科技有限公司",
"createDate": "2016.11.14 17:35:45",
"money": "-200",
"type": "1"
},
{
"companyName": "湖南省林森科技有限公司",
"createDate": "2016.11.10 17:35:45",
"money": "-5900",
"type": "1"
}
]
}
}
]
}
OK担败,這種情況很簡單。我們只要建立一個對象類镰官,然后通過網絡獲取到JSON的時候進行轉換,然后轉成我們的對象類即可吗货。
public class Bean {
private boolean success;
private String msg;
private List<ObjBean> obj;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<ObjBean> getObj() {
return obj;
}
public void setObj(List<ObjBean> obj) {
this.obj = obj;
}
public static class ObjBean {
/**
* month : {"date":"09月","list":[{"companyName":"寧波心科技有限公司","createDate":"2016.09.14 17:35:45","money":"5000","type":"2"},{"companyName":"湖南省林森科技有限公司","createDate":"2016.09.10 17:35:45","money":"5900","type":"2"}]}
*/
private MonthBean month;
public MonthBean getMonth() {
return month;
}
public void setMonth(MonthBean month) {
this.month = month;
}
public static class MonthBean {
/**
* date : 09月
* list : [{"companyName":"寧波心科技有限公司","createDate":"2016.09.14 17:35:45","money":"5000","type":"2"},{"companyName":"湖南省林森科技有限公司","createDate":"2016.09.10 17:35:45","money":"5900","type":"2"}]
*/
private String date;
private List<ListBean> list;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public List<ListBean> getList() {
return list;
}
public void setList(List<ListBean> list) {
this.list = list;
}
public static class ListBean {
/**
* companyName : 寧波心科技有限公司
* createDate : 2016.09.14 17:35:45
* money : 5000
* type : 2
*/
private String companyName;
private String createDate;
private String money;
private String type;
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
}
}
}
因為我是用Retrofit+Rxjava的泳唠。所以我們這邊就可以直接用
@GET("accountManage/getOrders.do")
Observable<Bean> getDealQuery(
@Query("companyCode")String companyCode,
@Query("orderID")int orderID,
@Query("status")int status);
這樣我們的JSON就自動轉換成了Bean對象,然后我們就對B對象進行相關操作即可宙搬。十分方便笨腥。比如獲取里面的內容拓哺,我們就bean.isSuccess()等。
這里生成的對象類我們用的是Android Studio的插件<GsonFormat>就可以生成脖母。把我們上面的JSON字符串輸入士鸥,它就能識別,幫忙生成相應的對象類谆级。十分方便烤礁。
鏈接:插件GsonFormat快速實現(xiàn)JavaBean
特殊格式
還是剛那個需求,可能后臺不是那么友好肥照,為了自己方便脚仔,少幾個字段,可能傳給你是這樣的JSON格式:
{
"success": true,
"msg": "用戶查詢訂單成功",
"obj": {
"09月": [
{
"companyName": "寧波心科技有限公司",
"createDate": "2016.09.14 17:35:45",
"money": "5000",
"type": "2"
},
{
"companyName": "湖南省林森科技有限公司",
"createDate": "2016.09.10 17:35:45",
"money": "5900",
"type": "2"
}
],
"11月": [
{
"companyName": "杭州心科技有限公司",
"createDate": "2016.11.14 17:35:45",
"money": "-200",
"type": "1"
},
{
"companyName": "湖南省林森科技有限公司",
"createDate": "2016.11.10 17:35:45",
"money": "-5900",
"type": "1"
}
]
}
}
這時候舆绎,我們的不同的月份鲤脏,直接就變成了Key值。然后Key值就會在變化吕朵。然后這個月的交易記錄內容就變成了這個月份Key值下的value值了猎醇。
說實話,我第一次拿到后臺傳給這個值的時候努溃,我內心是拒絕的硫嘶。別怪我太low,我真的沒見過key變化的JSON茅坛。然后開始想的就是把他繼續(xù)變成一個對象音半,來進行處理,我把這個JSON放入到了GsonFormat中,想繼續(xù)利用插件來生成Bean對象贡蓖。結果直接報錯了曹鸠。
為啥,因為GsonFormat插件把JSON變?yōu)锽ean對象是把這個Key值作為屬性名字斥铺,畢竟一般都認為Key值不變彻桃。但是你的Key值在變化。無法成功生成晾蜘。
我的解決方式(提下我用的是GSON):
把obj部分的內容拿出來邻眷。因為obj里面的內容中有key值在變,但還是符合規(guī)定的JSON格式剔交。我們可以把他變?yōu)镴SON對象肆饶。
public class Bean {
private boolean success;
private String msg;
private JsonObject obj;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public JsonObject getObj() {
return obj;
}
public void setObj(JsonObject obj) {
this.obj = obj;
}
}
這里的JsonObject是com.google.gson.JsonObject,因為我是用Gson來解析JSON的岖常。
這樣我們就可以順利的把后臺傳過來的JSON轉成了我們這個新的Bean對象了驯镊。我們可以繼續(xù)用上面的Rtrofit+Rxjava 的代碼來訪問:
@GET("accountManage/getOrders.do")
Observable<Bean> getDealQuery(
@Query("companyCode")String companyCode,
@Query("orderID")int orderID,
@Query("status")int status);
切記不要把這個新的Bean.java中的private JsonObject obj;換成什么private Obeject obj;等,不然等會拿到的Bean對象中的obj部分會是{ }這樣,里面是空的板惑。
為什么?你還好意思問我為什么!? 因為這個obj的JSON部分不能正確轉換成對象啊橄镜。不然剛那個GsonFormat插件就幫你轉成對象了啊7氤恕G⒔骸!裆馒!
好了姊氓。我們就拿到這個Bean對象后。我們通過bean.getObj()方法就順利拿到了JsonObject這個對象了领追。然后我們在對這個對象進行處理他膳。我們需要對他進行遍歷,然后分別拿到里面的Key值及Value值绒窑。然后我們可以再對里面的Value值轉換成一個對象棕孙。
- 我們一步步來,先進行遍歷些膨,分別拿到Key 和Value:
JsonObject jsonObject = bean.getObj();
if (jsonObject != null) {
Set<Map.Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for (Map.Entry<String, JsonElement> entry : entrySet) {
//entry.getKey()
//這是拿到了Key值蟀俊,也就是我們的month月份值
//jsonObject.getAsJsonArray(entry.getKey())
//我們拿到了value里面的值.
//因為value是一個JSON數(shù)組類型,所以我們直接用getAsJsonArray方法來獲取。
}
}
- 我們來把value值轉成對象订雾。
好了肢预。我們就來再建一個類。來把Value值中的JsonArray轉成相應的對象洼哎。這樣后面處理起來也方便烫映。當然這里我們可以繼續(xù)用我們的GsonFormat插件來生成。
public class ItemBean {
private String companyName;
private String createDate;
private String money;
private String type;
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
轉換為把JsonArray轉換成List<ItemBean>的代碼為:
Gson googleJson = new Gson();
List<ItemBean> value =
googleJson.fromJson(jsonObject.getAsJsonArray(entry.getKey()), new TypeToken<List<DealQueryInfoBean>>() {
}.getType());
//轉換成泛型類型噩峦,后面不能單純的寫成fromJson(XXX,ArrayList.class);
就這樣我們成功的把這個特殊的json轉換好了锭沟。變成了一個新的可操作的對象。后面的邏輯就大家自行寫了识补。????????????