Android基础——JSON数据的全方位解析
Android基础——JSON数据的全方位解析
本篇文章包括以下内容:
- JSON是什么
- JSONObject的解析和存储
- JSONObject的解析和存储(抽象)
- JSONArray的解析和存储
- 模拟周边加油站JSON数据实战
JSON是什么
JSON:JavaScript对象表示法(JavaScript Object Notation)
- JSON是存储和交换文本信息的语法
- JSON是轻量级的文本数据交换格式
- JSON独立于语言和平台
- JSON具有自我描述性,更易理解
类似XML,比XML更小、更快、更易解析
- 没有结束标签
- 更短
- 读写的速度更快
- 使用数组
- 不使用保留字
JSON语法是JavaScript对象表示法语法的子集
- 数据在名称/值对中
- 数据由逗号分割
- 花括号保存对象
- 方括号保存数据
JSON值可以是
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true或false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
JSONObject的解析和存储
JSONObject数据是用key-value来存储的,中间使用冒号隔开,外层的花括号表示一个对象
{
"username":"Hensen",
"qq":"510402535"
}
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
首先创建一个存储数据的Bean类
public class User {
private String username;
private int qq;
public User(String username, int qq) {
this.username = username;
this.qq = qq;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
下面我们使用将服务器获取的JSON数据放进一个JSON对象中,获取其对象中的值
//模拟服务器传来的JSON数据
String str ="{\n" +
"\t\"username\":\"Hensen\",\n" +
"\t\"qq\":\"510402535\""+
"\n}";
JSONObject json = new JSONObject(str);
String username = json.getString("username");
int qq = json.getInt("qq");
//使用对象的形式进行保存
User user = new User(username, qq);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
JSONObject的解析和存储(抽象)
我们会碰到在一个JSON中嵌套有其他JSON对象,而这个嵌套的JSON对象中可以抽象出共同的属性,看例子
"price":{
"E90":"5.36",
"E93":"5.77",
"E97":"6.25",
"E0":"5.34"
}
"gastprice":{
"92#":"5.58",
"0#车柴":"5.15"
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
这个时候我们就不用创建两个对象了,创建一个对象抽取他们的属性即可
首先创建一个存储数据的Bean类
public class FourthLevelObject {
private String type;
private String price;
public FourthLevelObject(String type, String price) {
this.type = type;
this.price = price;
}
@Override
public String toString() {
return "FourthLevelObject{" +
"type='" + type + '\'' +
", price='" + price + '\'' +
'}';
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
然后我们解析并存储
JSONObject price = data_json.getJSONObject("price");
JSONObject gastprice = data_json.getJSONObject("gastprice");
Iterator<String> keys_price = price.keys();
while (keys_price.hasNext()) {
String key = keys_price.next();
String value = price.getString(key);
//使用对象的形式进行保存
FourthLevelObject fourthLevelObject = new FourthLevelObject(key, value);
}
Iterator<String> keys_gastprice = gastprice.keys();
while (keys_gastprice.hasNext()) {
String key = keys_gastprice.next();
String value = gastprice.getString(key);
//使用对象的形式进行保存
FourthLevelObject fourthLevelObject = new FourthLevelObject(key, value);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
JSONArray的解析和存储
"data":[
{
"id":"59797",
"name":"太洋加油站"
},
{
"id":"11083",
"name":"中石化麻子岗加油站"
}
]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
通过遍历JSONArray,剩下的跟JSONObject一样,
JSONArray data = result.getJSONArray("data");
for (int i = 0; i < data.length(); i++) {
String id = data_json.getString("id");
String name = data_json.getString("name");
//使用对象的形式进行保存
User user = new User(id, name);
//如果User为嵌套对象,应该添加到集合中
//list.add(user);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
模拟周边加油站JSON数据实战
这里以周边加油站数据为例,其解析步骤有
- 分析数据中的成员变量(花括号为对象,方括号为数组,使用List存储数组)
- 根据分析后的结果,创建对应的对象
- 解析JSON数据、存储JSON数据
大家可以尝试一下自己写解析,发现哪里不对时,直接运行程序,系统会自动给你提示哪一行解析出错的
{
"resultcode":"200",
"reason":"Successed!",
"result":{
"data":[
{
"id":"59797",
"name":"太洋加油站",
"area":"514000",
"areaname":"广东省 梅州市 梅江区",
"address":"广东省梅州市梅江区环市北路家乐广场附近,路南侧",
"brandname":"不详",
"type":"其他",
"discount":"非打折加油站",
"exhaust":"国Ⅲ",
"position":"116.104117014,24.3286227908",
"lon":"116.11066877213",
"lat":"24.33427865799",
"price":{
"E90":"5.36",
"E93":"5.77",
"E97":"6.25",
"E0":"5.34"
},
"gastprice":{
"92#":"5.58",
"0#车柴":"5.15"
},
"fwlsmc":"",
"distance":2462
},
{
"id":"11083",
"name":"中石化麻子岗加油站",
"area":"516000",
"areaname":"广东省 梅州市",
"address":"广东省梅州市205国道与梅松路交叉口东南方向,嘉应大学附近",
"brandname":"中石化",
"type":"直营店",
"discount":"打折加油站",
"exhaust":"国Ⅲ",
"position":"116.124168,24.32516",
"lon":"116.13067098935",
"lat":"24.331051295968",
"price":{
"E90":"5.36",
"E93":"5.77",
"E97":"6.25",
"E0":"5.34"
},
"gastprice":{
"92#":"5.58",
"95#":"6.05",
"0#车柴":"5.15"
},
"fwlsmc":"银联卡,信用卡支付,加油卡,便利店,93#自助加油,柴油自助加油,97#自助加油,发卡充值网点,银联卡充值,加油卡充值业务",
"distance":439
},
{
"id":"51175",
"name":"月梅加油站",
"area":"514000",
"areaname":"广东省 梅州市 梅江区",
"address":"广东省梅州市梅江区月梅路月梅农贸批发市场北,路西侧",
"brandname":"不详",
"type":"其他",
"discount":"非打折加油站",
"exhaust":"国Ⅲ",
"position":"116.1250119928,24.3291280115",
"lon":"116.1315112916",
"lat":"24.335033948452",
"price":{
"E90":"5.36",
"E93":"5.77",
"E97":"6.25",
"E0":"5.34"
},
"gastprice":{
"92#":"5.58",
"0#车柴":"5.15"
},
"fwlsmc":"",
"distance":465
},
{
"id":"29356",
"name":"中石化嘉华加油站",
"area":"514700",
"areaname":"广东省 梅州市 梅县",
"address":"广东省梅州市梅江区月梅路与碧桂路交叉路口,路东",
"brandname":"中石化",
"type":"直营店",
"discount":"打折加油站",
"exhaust":"国Ⅲ",
"position":"116.1192494629,24.3272616485",
"lon":"116.132454",
"lat":"24.339033",
"price":{
"E90":
