多层嵌套数字key的json解析.docx
- 文档编号:23378920
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:26
- 大小:565.23KB
多层嵌套数字key的json解析.docx
《多层嵌套数字key的json解析.docx》由会员分享,可在线阅读,更多相关《多层嵌套数字key的json解析.docx(26页珍藏版)》请在冰豆网上搜索。
多层嵌套数字key的json解析
变态的json解析,key为数字,设置没有key!
如何解析呢?
Android 康师傅
标题:
变态的json解析,key为数字,设置没有key!
如何解析呢?
关键字:
json解析、key为数字、没有key
导语:
最近做的项目是一个打车类的项目,需要选择地址,而数据是Json数据。
因为这些数据不对公司造成任何的损失,也没有涉及到任何的隐私或者商业秘密,所以就写此文,说说暂时的解决方法吧,嘻嘻!
遇到的问题:
不是标准的json数据,有些甚至没有key。
比如说一开始的北京,0,这些都没有key。
另外,有key的都是数字。
是数据的话,第一个层级是0~33.然而第二个层级是不定的,也就是不能用for循环啦,哈哈!
先看看数据吧:
数据如下:
全国省市县三级Json数据
解析的核心类:
(没有进行封装)
Java
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
packagecom.sunofbeaches.jsondemo;
importjava.util.Map.Entry;
importjava.util.Set;
importcom.google.gson.JsonArray;
importcom.google.gson.JsonElement;
importcom.google.gson.JsonObject;
importcom.google.gson.JsonParser;
importandroid.os.Bundle;
importandroid.app.Activity;
publicclassMainActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parserJson();
}
privatevoidparserJson(){
//获取到数据
StringjsonString=getResources().getString(R.string.jsonstring);
//json解析者
JsonParserjsonParser=newJsonParser();
//解析成Json对象
JsonObjectasJsonObject=jsonParser.parse(jsonString)
.getAsJsonObject();
//遍历里头的数据
Set
for(Entry
entrySet){
JsonArrayasJsonArray=entry.getValue().getAsJsonArray();
StringasString=asJsonArray.get(0).getAsString();//省份
System.out.println("asString--"+asString);
intasInt=asJsonArray.get
(1).getAsInt();//那个数字
System.out.println("asInt--"+asInt);
//获取到第3个,又是一个json对象
JsonObjectasJsonObject2=asJsonArray.get
(2).getAsJsonObject();
//遍历第2级数据
Set
.entrySet();
for(Entry
entrySet2){
JsonArrayasJsonArray2=entry2.getValue().getAsJsonArray();
if(asJsonArray2.size()==1){//这一个判断是因为在河北市(42249)里头只有一级,没有下一级了
StringasString2=asJsonArray2.get(0).getAsString();//市级
System.out.println("asString2===="+asString2);
}else{
StringasString2=asJsonArray2.get(0).getAsString();//市级
System.out.println("asString2===="+asString2);
intasInt2=asJsonArray2.get
(1).getAsInt();//数字
System.out.println("asInt====="+asInt2);
//获取第三级数据(县级/区)
JsonObjectasJsonObject3=asJsonArray2.get
(2)
.getAsJsonObject();
//遍历第三级数据
Set
.entrySet();
for(Entry
entrySet3){
JsonArrayasJsonArray3=entry3.getValue()
.getAsJsonArray();
StringasString3=asJsonArray3.get(0).getAsString();//县级数据
System.out.println("asString3>>>>>>"+asString3);
}
}
}
}
}
}
封装成对象
因为数据不标准,所以我们不能直接创建一个bean类,用gson直接解析,因为gson的直接解析是使用反射的方法來做的。
那么这里也说说吧,如果直接是用bean类來解析的话,需要它的权限所有都是public的,类是public的,里面的成员,所有都是public的,这是第一点。
那么第二点就是这个里面的名字要和这个json数据里的名字要一样哦。
就是对应的数据名字要一样,原因还是因为使用反射的方法來解析嘛。
ok,那么通过上面这个核心方法,我们可以定义出以下的bean类,然后手动地赋值,就可以封装起來了。
主要的bean类
这些bean结构和Json里的数据是一样的结构,只是名字不一样。
因为Java中数字不能作为变量的名字嘛,是吧!
这个我们小时候学java就知道啦,标识符的规则。
好的,直接上bean类吧!
这个是整体的bean类
codeby
Java
1
2
3
4
5
6
7
8
packagecom.sunofbeaches.jsondemo.bean;
importjava.util.List;
publicclassJsonBean{
publicList
}
这个省份的bean类
Java
1
2
3
4
5
6
7
8
9
10
packagecom.sunofbeaches.jsondemo.bean;
importjava.util.List;
publicclassProvinces{
publicStringprovinceName;
publicintshengNumber;
publicList
}
市级的bean类
Java
1
2
3
4
5
6
7
8
9
packagecom.sunofbeaches.jsondemo.bean;
importjava.util.List;
publicclassCity{
publicStringcityName;
publicintchengshiNumber;
publicList
}
镇/区级的bean类
Java
1
2
3
4
5
packagecom.sunofbeaches.jsondemo.bean;
publicclassCountry{
publicStringcountryNmae;
}
有了bean类之后,我们可以对数据进行封装,因为前面我们已经解析了数据嘛!
数据封装:
数据封装核心类,其实和这个解析类在一起了,那么个类的功能就是解析数据,并封装数据,返回一个bean类
Java
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
packagecom.sunofbeaches.jsondemo;
importjava.util.ArrayList;
importjava.util.Map.Entry;
importjava.util.Set;
importandroid.content.Context;
importcom.google.gson.JsonArray;
importcom.google.gson.JsonElement;
importcom.google.gson.JsonObject;
importcom.google.gson.JsonParser;
importcom.orange.jsondemo.R;
importcom.sunofbeaches.jsondemo.bean.City;
importcom.sunofbeaches.jsondemo.bean.Country;
importcom.sunofbeaches.jsondemo.bean.JsonBean;
importcom.sunofbeaches.jsondemo.bean.Provinces;
publicclassGetAllDatasBean{
publicJsonBeangetAllDatas(Contextcontext){
//整体Bean类
JsonBeanbean=newJsonBean();
bean.Provinces=newArrayList
//获取到数据
StringjsonString=context.getResources().getString(
R.string.jsonstring);
//json解析者
JsonParserjsonParser=newJsonParser();
//解析成Json对象
JsonObjectasJsonObject=jsonParser.parse(jsonString)
.getAsJsonObject();
//遍历里头的数据
Set
for(Entry
entrySet){
//省bean类
Provincesprovince=newProvinces();
province.cities=newArrayList
JsonArrayasJsonArray=entry.getValue().getAsJsonArray();
StringasString=asJsonArray.get(0).getAsString();//省份
//赋值
province.provinceName=asString;
System.out.println("asString>>"+asString);
intasInt=asJsonArray.get
(1).getAsInt();//那个数字
//赋值
province.shengNumber=asInt;
//获取到第3个,又是一个json对象
JsonObjectasJsonObject2=asJsonArray.get
(2).getAsJsonObject();
//遍历第2级数据
Set
.entrySet();
for(Entry
entrySet2){
JsonArrayasJsonArray2=entry2.getValue().getAsJsonArray();
//市bean类
Citycity=newCity();
city.countries=newArrayList
if(asJsonArray2.size()==1){//这一个判断是因为在河北市(42249)里头只有一级,没有下一级了
StringasString2=asJsonArray2.get(0).getAsString();//市级
city.cityName=asString2;
city.chengshiNumber=-1;//表示没有
city.countries=null;//表示没有,使用的时候要记得判断
}else{
StringasString2=asJsonArray2.get(0).getAsString();//市级
//赋值
city.cityName=asString2;
intasInt2=asJsonArray2.get
(1).getAsInt();//数字
//赋值
city.chengshiNumber=asInt2;
//获取第三级数据(县级/区)
JsonObjectasJsonObject3=asJsonArray2.get
(2)
.getAsJsonObject();
//遍历第三级数据
Set
.entrySet();
for(Entry
entrySet3){
JsonArrayasJsonArray3=entry3.getValue()
.getAsJsonArray();
StringasString3=asJsonArray3.get(0).getAsString();//县级数据
//县级/区数据bean类
Countrycountry=newCountry();
country.countryNmae=asString3;
city.countries.add(country);//添加县/区
}
}
province.cities.add(city);
}
bean.Provinces.add(province);
}
returnbean;
}
}
到这里,数据已经完成了解析,也完成了封装,可以直接得到一个包含了所有数据的类。
那么怎么使用呢?
下面,就通过一个例子來使用一下这面里的数据吧!
省市镇三级联动例子(使用数据)
布局如下:
Java
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
android=" xmlns: tools=" android: layout_width="match_parent" android: layout_height="match_parent" tools: context=".MainActivity"> android: id="@+id/provinces" android: layout_width="0dp" android: layout_height="wrap_content" android: layout_weight="1"/> android: id="@+id/cities" android: layout_width="0dp" android: layout_height="wrap_content" android: layout_weight="1"/> android: id="@+id/countries" android: layout_width="0dp" android: layout_height="wrap_content" android: layout_weight="1"/> 当然,是没有数据的,嘻嘻! 核心类如下: Java 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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 packagecom.sunofbeaches.jsondemo; importjava.util.List; importandroid.app.Activity; importandroid.os.Bundle; importandroid.util.L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多层 嵌套 数字 key json 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)