java JSONObject和JSONArray实现对JSON数据的简单解析

近期在连百度AI的人脸识别端口,在连接成功后服务器会返回这样的result字符串

result:{
	"error_code":0,
	"error_msg":"SUCCESS",
	"log_id":**************,
	"timestamp":***************,
	"cached":0,
	"result":{
		"face_num":1,
		"face_list":[
			{
			"face_token":"********************",
			"location":{
				"left":379.98,
				"top":378.68,
				"width":33,
				"height":39,
				"rotation":-18
				},
			"face_probability":0.57,
			"angle":{
				"yaw":59.01,
				"pitch":13.45,
				"roll":-23.75
				},
			"age":24,
			"beauty":39.72,
			"expression":{
				"type":"none",
				"probability":1
				},
			"face_shape":{
				"type":"oval",
				"probability":0.33
				},
			"gender":{
				"type":"male",
				"probability":0.96
				},
			"glasses":{
				"type":"common",
				"probability":0.61
				},
			"race":{
				"type":"white",
				"probability":0.63
				},
			"quality":{
				"occlusion":{
					"left_eye":0.16,
					"right_eye":0.22,
					"nose":0.08,
					"mouth":0,
					"left_cheek":0.71,
					"right_cheek":0.01,
					"chin_contour":0
					},
				"blur":1,
				"illumination":136,
				"completeness":1
				},
			"eye_status":{
				"left_eye":0.39,
				"right_eye":0.75
				},
			"emotion":{
				"type":"neutral",
				"probability":0.32
				},
			"face_type":{
				"type":"human",
				"probability":0.73
				}
			}
			]
		}
	}

而我只想用两个数据:age和beauty,可是这个数据在哪?
在这里插入图片描述
可谓是一层套一层
那么要如何把这个东西取出来呢?
首先我学到了一个比较容易上手的方法是:去一层层的嵌套
看这个比较短的图
在这里插入图片描述
直接上代码一步步搞(需要引入JSONObject包)

		//将最外面的括号里面的内容提取出来
        JSONObject jsonObject = new JSONObject(result);
		//将内容result的内容提取出来,内容为jsonObject(key-value)型
        JSONObject jsonResult = jsonObject.getJSONObject("result");
        //将内部result的列表提取出来
        JSONArray jsonFaceList = jsonResult.getJSONArray("face_list");
        //将列表的第一组元素提取出来(0代表的是第几组元素)
        JSONObject jsonBeauty = jsonFaceList.getJSONObject(0);
        //获取key对应内容,注意使用和value类型相对应的get方法
        double resultOfBeauty = jsonBeauty.getDouble("beauty");
        double resultOfAge = jsonBeauty.getDouble("age");

jsonObject内容为
在这里插入图片描述
jsonResult内容为
在这里插入图片描述
jsonFaceList内容为
在这里插入图片描述
jsonBeauty内容为
在这里插入图片描述
我们会发现,到了这里,beauty的内容就是最外层的了,这时我们只需要直接提取就可以了
这样就解决了我的一个取值问题
那有同学问了:那要是JSONArray里面不只有一组怎么办?
例如这个样子?
在这里插入图片描述
我们选择的方法会有两种,但这两种方法的实质相同:
迭代
第一种是设置key的数量个List存储对应的内容,然后迭代进行读取
直接上代码

//设置三个List存储内容
List<String> id = new List<>();
List<String> name = new List<>();
List<String> number = new List<>();
//迭代取内容
for (int i=0;i<jsonArray.length();i++){
	//临时存储当前组的内容
    JSONObject tempOfObject = jsonArray.getJSONObject(i);
    //根据键值来取数据并将其对应存到List中
    JSONString idOfObject = tempOfObject.getString("id");
    id.add(idOfObject);
    JSONString nameOfObject = tempOfObject.getString("name");
    name.add(nameOfObject);
    JSONString numberOfObject = tempOfObject.getString("number");
    number.add(numberOfObject);
}

第二种是使用迭代器,这个是含键值对的数据结构中常用的一种迭代用工具,可以直接对key值进行读取,需要使用next这样的方法移动指针读取迭代器中的数据(类似python字典里面的迭代器)

//设置一个数组存储内容
List<String> saveData = new List<>();
//设置数组存储起点为0
int start=0;
//设置一次迭代的存储数据数量,用于之后对List的读取
int count = 0;
for (int i=0;i<jsonArray.length();i++){
	//临时存储
    JSONObject tempOfObject = jsonArray.getJSONObject(i);
    //设置迭代器存储所有的key值
    Iterator iterator = tempOfObject.keys();
    //当迭代器中还有未读取的内容时进行迭代,hasNext()方法不移动迭代器的指针
    count = 0;
    while(iterator.hasNext()){
    	//将读取到的key值临时储存,同时next方法将迭代器的指针下移
        String currnetKey = (String) iterator.next();
        //将key对应的值以String的类型存储到数据数组中
        saveData[start] = tempOfObject.getString(currnetKey);
        //推动数据
        start++;
        count++;
    }
}

这样就可以将数据以String格式暂时存到同一个List中,之后使用时根据count来对应地址,将类型转换即可。

发布了36 篇原创文章 · 获赞 11 · 访问量 2905

猜你喜欢

转载自blog.csdn.net/yeweij226/article/details/100017315