Android解析多层json数据并用递归进行查找
采用Gson进行json字符串的解析,然后利用递归进行特定数据的查找。
需要处理的数据
首先,需要处理的json长这样
{
"code":10,
"data":[
{
"children":[
{
"children":[
{
"children":[],
"id":"21",
"name":"分公司21",
"type":2,
"wechatId":21
},
{
"children":[
{
"children":[
{
"children":[
{
"children":[],
"id":"31",
"name":"分公司门店31",
"type":3,
"wechatId":31
}
],
"id":"22",
"name":"分公司22",
"type":2,
"wechatId":22
},
{
"children":[],
"id":"32",
"name":"分公司门店32",
"type":3,
"wechatId":32
}
],
"id":"23",
"name":"分公司23",
"type":2,
"wechatId":23
}
],
"id":"24",
"name":"分公司24",
"type":2,
"wechatId":24
},
{
"children":[
{
"children":[],
"id":"33",
"name":"分公司门店33",
"type":3,
"wechatId":33
},
{
"children":[],
"id":"34",
"name":"分公司门店34",
"type":3,
"wechatId":34
}
],
"id":"25",
"name":"分公司25",
"type":2,
"wechatId":25
},
{
"children":[
{
"children":[],
"id":"35",
"name":"分公司门店35",
"type":3,
"wechatId":35
}
],
"id":"26",
"name":"分公司26",
"type":2,
"wechatId":26
},
{
"children":[],
"id":"36",
"name":"分公司门店36",
"type":3,
"wechatId":36
},
{
"children":[],
"id":"37",
"name":"分公司门店37",
"type":3,
"wechatId":37
},
{
"children":[],
"id":"38",
"name":"分公司门店38",
"type":3,
"wechatId":38
}
],
"id":"27",
"name":"分公司27",
"type":2,
"wechatId":27
},
{
"children":[],
"id":"28",
"name":"分公司28",
"type":2,
"wechatId":28
},
{
"children":[],
"id":"29",
"name":"分公司29",
"type":2,
"wechatId":29
},
{
"children":[
{
"children":[],
"id":"39",
"name":"分公司门店39",
"type":3,
"wechatId":39
}
],
"id":"210",
"name":"分公司210",
"type":2,
"wechatId":210
},
{
"children":[],
"id":"211",
"name":"分公司211",
"type":2,
"wechatId":211
},
{
"children":[
{
"children":[
{
"children":[],
"id":"212",
"name":"分公司212",
"type":2,
"wechatId":212
}
],
"id":"213",
"name":"分公司213",
"type":2,
"wechatId":213
},
{
"children":[],
"id":"310",
"name":"分公司门店310",
"type":3,
"wechatId":310
},
{
"children":[],
"id":"311",
"name":"分公司门店311",
"type":3,
"wechatId":311
}
],
"id":"214",
"name":"分公司214",
"type":2,
"wechatId":214
},
{
"children":[
{
"children":[],
"id":"312",
"name":"分公司门店312",
"type":3,
"wechatId":312
}
],
"id":"215",
"name":"分公司215",
"type":2,
"wechatId":215
},
{
"children":[],
"id":"216",
"name":"分公司216",
"type":2,
"wechatId":216
},
{
"children":[],
"id":"217",
"name":"分公司217",
"type":2,
"wechatId":217
},
{
"children":[
{
"children":[],
"id":"313",
"name":"分公司门店313",
"type":3,
"wechatId":313
}
],
"id":"218",
"name":"分公司218",
"type":2,
"wechatId":218
},
{
"children":[],
"id":"219",
"name":"分公司219",
"type":2,
"wechatId":219
},
{
"children":[],
"id":"220",
"name":"分公司220",
"type":2,
"wechatId":220
},
{
"children":[],
"id":"221",
"name":"分公司221",
"type":2,
"wechatId":221
},
{
"children":[
{
"children":[
{
"children":[
{
"children":[
{
"children":[],
"id":"314",
"name":"分公司门店314",
"type":3,
"wechatId":314
}
],
"id":"222",
"name":"分公司222",
"type":2,
"wechatId":222
}
],
"id":"223",
"name":"分公司223",
"type":2,
"wechatId":223
}
],
"id":"224",
"name":"分公司224",
"type":2,
"wechatId":224
},
{
"children":[],
"id":"315",
"name":"分公司门店315",
"type":3,
"wechatId":315
},
{
"children":[],
"id":"316",
"name":"分公司门店316",
"type":3,
"wechatId":151
}
],
"id":"225",
"name":"分公司225",
"type":2,
"wechatId":225
},
{
"children":[
{
"children":[],
"id":"317",
"name":"分公司门店317",
"type":3,
"wechatId":317
}
],
"id":"226",
"name":"分公司226",
"type":2,
"wechatId":226
},
{
"children":[],
"id":"227",
"name":"分公司227",
"type":2,
"wechatId":227
},
{
"children":[
{
"children":[],
"id":"318",
"name":"分公司门店318",
"type":3,
"wechatId":318
}
],
"id":"228",
"name":"分公司228",
"type":2,
"wechatId":228
},
{
"children":[
{
"children":[],
"id":"319",
"name":"分公司门店319",
"type":3,
"wechatId":319
},
{
"children":[],
"id":"320",
"name":"分公司门店320",
"type":3,
"wechatId":320
},
{
"children":[],
"id":"321",
"name":"分公司门店321",
"type":3,
"wechatId":321
}
],
"id":"229",
"name":"分公司229",
"type":2,
"wechatId":229
},
{
"children":[],
"id":"230",
"name":"分公司230",
"type":2,
"wechatId":230
},
{
"children":[],
"id":"322",
"name":"分公司门店322",
"type":3,
"wechatId":322
}
],
"id":"11",
"name":"总公司",
"type":1,
"wechatId":11
}
],
"msg":"请求成功"
}
主要数据里面有三种类型,分别是总公司、分公司、分公司下的门店,它们以type分类,type=1为总公司,type=2为分公司,type=3为分公司门店,对这段数据的处理要求是,获取所有的分公司门店的“name”和“id”并一一对应,至于总公司和分公司不作处理。
使用Gson进行处理
创建ChildBean类,代码如下
public class ChildBean {
private String id;
private String name;
private String type;
private String wechId;
private List<ChildBean> children;
@Override
public String toString() {
return "ChildBean{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", type='" + type + '\'' +
", wechId='" + wechId + '\'' +
", children=" + children +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getWechId() {
return wechId;
}
public void setWechId(String wechId) {
this.wechId = wechId;
}
public List<ChildBean> getChildren() {
return children;
}
public void setChildren(List<ChildBean> children) {
this.children = children;
}
}
准备工作
首先定义几个集合
private HashMap<String, String> mendian = new HashMap<>();
private List<ChildBean> listjson = new ArrayList<>();
获取到json字符串
String strJsonData = response.body().string();//response为网络获取到的json字符串
需要处理的数据在“data[ ]”里面,所以和“data”同级的“code”、"msg"等不处理,获取“data”里面的数据就行了。
JsonObject jsonObject = new JsonParser().parse(strJsonData).getAsJsonObject();
JsonArray jsonArray = jsonObject.getAsJsonArray("data");
接下来将JsonArray数组里面的数据放到listjson里面,然后对listjson里面的数据进行操作
Gson gson = new Gson();
listjson = gson.fromJson(jsonArray, new TypeToken<List<ChildBean>>(){}.getType());
//写一个getJsonData()方法
getJsonData();
数据查找
getJsonData()方法的实现,采用递归的方式查找实现,获取到所有type为3,分公司门店name和id对应的数据
private void getJsonData() {
List<ChildBean> temp;
for (ChildBean mBean : listjson) {
if (mBean.getType().equals(String.valueOf(3))) {
String name = mBean.getName();
String id = mBean.getId();
mendian.put(name, id);
}
if (mBean.getChildren() != null) {
temp = new ArrayList<>();
List<ChildBean> childBeanss = mBean.getChildren();
for (ChildBean nBean : childBeanss) {
temp.add(nBean);
if (nBean.getType().equals(String.valueOf(3))) {
String name = nBean.getName();
String id = nBean.getId();
mendian.put(name, id);
}
}
listjson = temp;
getJsonData();
}
}
}
//注意两个if里面的一个是mBean,一个是nBean,不一样
获取的部分数据形式为
//{name=id,name=id,name=id,......}
{分公司门店31=31,分公司门店32=32,分公司门店33=33,分公司门店34=34,......}
接下来就可以对数据进行其他的操作了,同理获取其他数据也是类似的。
总结
主要使用了Gson解析json字符串,然后面对多层嵌套的json数据,采用了递归的查找方式。