目前,调用接口返回的数据一般都是JSON字符串的形式,所以,解析JOSN字符串拿到自己想要的数据就很常用了。在解析前,首先要明确,JOSN分为两种形式:
1.对象格式:{"key":value,"key1":value1} 其中的value可以是任意值;
2.数组格式:[e1,e2] 其中的e可以是任意值。
如下,是调用高德地址编码接口返回的JSON字符串,本文以解析并拿到地址的省市区信息为例(想要快速看出JSON字符串的结构,推荐使用JSON在线解析工具:https://www.json.cn/)
{
"infocode":"10000",
"count":"1",
"geocodes":[{
"building":{"name":[],"type":[]},
"township":[],
"location":"120.249859,30.292355",
"street":"艮山东路",
"neighborhood":{"name":[],"type":[]},
"number":"150号",
"country":"中国",
"city":"杭州市",
"citycode":"0571",
"level":"门牌号",
"formatted_address":"浙江省杭州市江干区艮山东路|150号",
"province":"浙江省",
"adcode":"330104",
"district":"江干区"
}],
"status":"1",
"info":"OK"
}
1.首先,最外层是JSON对象的形式{"key":value,"key1":value1},如果我们要获得infocode的值,代码如下(其中的jsonObject为上边字符串转的JSON对象):
打印结果是1000
2.现在解析复杂一点的值geocodes内的省市区值,首先获取geocodes,此时要注意geocodes是JSON数组的形式[e1,e2],所以获取方法跟JSON对象有所不同,代码如下
JSONArray jsonArray = jsonObject.getJSONArray("geocodes");
JSONArray的值如下:
[{
"building":{"name":[],"type":[]},
"township":[],
"location":"120.249859,30.292355",
"street":"艮山东路",
"neighborhood":{"name":[],"type":[]},
"number":"150号",
"country":"中国",
"city":"杭州市",
"citycode":"0571",
"level":"门牌号",
"formatted_address":"浙江省杭州市江干区艮山东路|150号",
"province":"浙江省",
"adcode":"330104",
"district":"江干区"
}]
3.解析JSONArray。分析得知,JOSN数组中只有一个JSON对象[{}],所以得到此JOSN对象的方法如下
得到的str就又是JSON对象字符串了,转JSON对象
JSONObject fromObject = JSONObject.fromObject(str);
获得省市区字段
至此,就解析得到我们需要的省市区数据
在解析的过程中,哪怕嵌套再多层,按照以上的方法一步步的解析,就会解析得到想要的结果。