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 listjson = new ArrayList<>();
1
2
获取到json字符串

String strJsonData = response.body().string();//response为网络获取到的json字符串
1
需要处理的数据在“data[ ]”里面,所以和“data”同级的“code”、"msg"等不处理,获取“data”里面的数据就行了。

JsonObject jsonObject = new JsonParser().parse(strJsonData).getAsJsonObject();
JsonArray jsonArray = jsonObject.getAsJsonArray(“data”);
1
2
接下来将JsonArray数组里面的数据放到listjson里面,然后对listjson里面的数据进行操作

Gson gson = new Gson();
listjson = gson.fromJson(jsonArray, new TypeToken<List>(){}.getType());
//写一个getJsonData()方法
getJsonData();
1
2
3
4
数据查找
getJsonData()方法的实现,采用递归的方式查找实现,获取到所有type为3,分公司门店name和id对应的数据

private void getJsonData() {
List 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 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,不一样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
获取的部分数据形式为

//{name=id,name=id,name=id,…}
{分公司门店31=31,分公司门店32=32,分公司门店33=33,分公司门店34=34,…}
1
2
接下来就可以对数据进行其他的操作了,同理获取其他数据也是类似的。

总结
主要使用了Gson解析json字符串,然后面对多层嵌套的json数据,采用了递归的查找方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的工具类,可以递归解析多层嵌套的 JSON 数据: ```java import org.json.JSONArray; import org.json.JSONObject; public class JsonParser { public static void parse(JSONObject json) { for (String key : json.keySet()) { Object value = json.get(key); if (value instanceof JSONObject) { System.out.println("Object: " + key); parse((JSONObject) value); } else if (value instanceof JSONArray) { System.out.println("Array: " + key); parseArray((JSONArray) value); } else { System.out.println(key + ": " + value.toString()); } } } private static void parseArray(JSONArray array) { for (int i = 0; i < array.length(); i++) { Object value = array.get(i); if (value instanceof JSONObject) { System.out.println("Object: " + i); parse((JSONObject) value); } else if (value instanceof JSONArray) { System.out.println("Array: " + i); parseArray((JSONArray) value); } else { System.out.println(i + ": " + value.toString()); } } } } ``` 使用示例: ```java public class TestJsonParser { public static void main(String[] args) { String jsonStr = "{\"name\":\"John\",\"age\":30,\"cars\":[{\"name\":\"Ford\",\"models\":[\"Fiesta\",\"Focus\",\"Mustang\"]},{\"name\":\"BMW\",\"models\":[\"320\",\"X3\",\"X5\"]}],\"address\":{\"street\":\"Downing Street 10\",\"city\":\"London\"}}"; JSONObject json = new JSONObject(jsonStr); JsonParser.parse(json); } } ``` 输出结果: ``` name: John age: 30 Array: cars Object: 0 name: Ford Array: models 0: Fiesta 1: Focus 2: Mustang Object: 1 name: BMW Array: models 0: 320 1: X3 2: X5 Object: address street: Downing Street 10 city: London ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值