解析Json數據想必對于每一位開發者都熟悉的不能再熟悉,說到解析工具,那肯定也是蘿卜青菜各有所愛,時下流行的fastjson,Gson,JSONObject等等想必大家都各有所長。
說到解析,我想最重要的就是構建Model類了,不過自從有了GsonFormat這個工具之后,就再也不用那么麻煩的手動定義一個個字段,重寫get,set方法等等。
但是呢,這樣的解析對我們的Json數據格式要求比較嚴格,有的服務端返回的數據格式隨心所欲,一層層的嵌套不說,主要是每個字段對應的key值還是不確定的,雖然之前也遇到過這樣的數據,也不需要建立模型,利用JSONObject就能解析到想要的數據,但鑒于這次的數據相對復雜,就碼點文字記錄下。
另類之處:1.N層嵌套 2.數據的key值不確定
先上圖來看看這組數據
9D53E10C-6D1A-45B8-8382-30202F2991C5.png
箭頭上面的是非常標準的格式不管用那種方法解析起來肯定都是非常簡單的,那我們就直接從箭頭下面的數據看,
json.gif
展開data數組瞬間懵逼,這里面是什么?仔細觀察發現里面有兩種數據類型,type=0
時,里面有一個數組但是他的key
不是固定的,這里有cb1,cb2,cb3.
type=1
時,里面就是一個字符串,同樣他的key
是變化的,ddl,ddl2,ddl3.....ddln.
既然有兩類數據,那我們就分開解析,首先看type=1
時相對簡單,我們就從這組數據開始解析。
type=1
,key值不確定 解析方法:
- 關鍵代碼
public void parseData(String result) {
headData = new ArrayList<String>();
keyData = new ArrayList<String>();
try {
JSONObject jsonObject = new JSONObject(result);
JSONArray jsonArray = jsonObject.getJSONArray("data");
// 遍歷data數組
for(int i=0;i<jsonArray.length();i++){
JSONObject lan = jsonArray.getJSONObject(i);
// 利用迭代器取出所有不確定的key值
Iterator<String> keys = lan.keys();
while (keys.hasNext()){
String key = String.valueOf(keys.next());
// 通過key值才得到對應的value值
String value = lan.getString(key);
if(value.length()>1){
// value不為空時將value值存進headData集合,就是我們要用的
headData.add(value);
// 如果這些不確定的key也有需要的話,也將他們存進集合里面
keyData.add(key);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
- headData和keyData.add是兩個集合我們用來存放到的String值和那些不確定的key值(如果有用的話)
type=0
,key值不確定 解析方法:
- 關鍵代碼
public void parseData(String result) {
headData = new ArrayList<String>();
bodyData = new ArrayList<String>();
keyData = new ArrayList<String>();
keyBodyData = new ArrayList<String>();
try {
JSONObject jsonObject = new JSONObject(result);
JSONArray jsonArray = jsonObject.getJSONArray("data");
for(int i=0;i<jsonArray.length();i++){
JSONObject lan = jsonArray.getJSONObject(i);
if(lan.getInt("type")==0){
Log.e(TAG,lan.toString());
Iterator<String> keys = lan.keys();
while (keys.hasNext()){
String key = String.valueOf(keys.next());
String value = lan.getString(key);
if(value.length()>1){
keyBodyData.add(key);
cbValue.put(key,value);
JSONArray jsonArray1 = lan.getJSONArray(key);
// Log.e("DDD",keyBodyData.toString());
for (int j=0;j<jsonArray1.length();j++){
String item = jsonArray1.getString(j);
// Log.e("ITEM",item);
bodyData.add(item);
}
}
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
其實主要難點還是因為返回的數據key值是變化的,所以只要熟練掌握JSONObject的解析方法,嵌套再復雜的數據解析起來都不是問題。