近期在连百度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来对应地址,将类型转换即可。