特殊JSON處理(如省市區資料,國家區號資料)
阿新 • • 發佈:2019-01-04
在實際開發中,現在安卓端和後臺之間的資料互動,一般都是用JSON來傳遞資料資訊。JSON大家一般都比較熟悉。我這邊就以實際專案中的後臺傳過來的情況和大家分析下及如何處理。
比如後臺返回一個交易查詢:
我們看到這個列表本身要按月份來進行分類。然後月份裡面再是具體的一項項記錄。
這裡我們分二種後臺傳給你的JSON格式情況講解下:(重點是第二種情況)
普通格式
一般來說後臺會根據這個需求傳遞相關JSON:
比如後臺一般這麼發給你:
{ "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的時候進行轉換,然後轉成我們的物件類即可。
/**
* 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"}]}}]
*/
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;
}
}
}
}
之後使用Gson就可以直接轉化成bean物件。
特殊格式
還是剛那個需求,可能後臺不是那麼友好,為了自己方便,少幾個欄位,可能傳給你是這樣的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。然後開始想的就是把他繼續變成一個物件,來進行處理,我把這個JSON放入到了GsonFormat中,想繼續利用外掛來生成Bean物件。結果直接報錯了。
我的解決方式(提下我用的是GSON):
把obj部分的內容拿出來。因為obj裡面的內容中有key值在變,但還是符合規定的JSON格式。我們可以把他變為JSON物件。
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的。
切記不要把這個新的Bean.java中的private JsonObject obj;換成什麼private Obeject obj;等,不然等會拿到的Bean物件中的obj部分會是{ }這樣,裡面是空的。
為什麼?你還好意思問我為什麼!? 因為這個obj的JSON部分不能正確轉換成物件啊。不然剛那個GsonFormat外掛就幫你轉成物件了啊!!!!
好了。我們就拿到這個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陣列型別,所以我們直接用getAsJsonArray方法來獲取。
}
}
- 我們來把value值轉成物件。
好了。我們就來再建一個類。來把Value值中的JsonArray轉成相應的物件。這樣後面處理起來也方便。當然這裡我們可以繼續用我們的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轉換好了。變成了一個新的可操作的物件。後面的邏輯就大家自行寫了。
原文地址:傳送門