解析Json数据想必对于每一位开发者都熟悉的不能再熟悉,说到解析工具,那肯定也是萝卜青菜各有所爱,时下流行的fastjson,Gson,JSONObject等等想必大家都各有所长。
说到解析,我想最重要的就是构建Model类了,不过自从有了GsonFormat这个工具之后,就再也不用那么麻烦的手动定义一个个字段,重写get,set方法等等。
但是呢,这样的解析对我们的Json数据格式要求比较严格,有的服务端返回的数据格式随心所欲,一层层的嵌套不说,主要是每个字段对应的key值还是不确定的,虽然之前也遇到过这样的数据,也不需要建立模型,利用JSONObject就能解析到想要的数据,但鉴于这次的数据相对复杂,就码点文字记录下。
另类之处:1.N层嵌套 2.数据的key值不确定
先上图来看看这组数据
箭头上面的是非常标准的格式不管用那种方法解析起来肯定都是非常简单的,那我们就直接从箭头下面的数据看,
展开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的解析方法,嵌套再复杂的数据解析起来都不是问题。