遍历JObject中的Json数据(以百度云人脸识别api返回的JSON数据为例)
因为最近在玩树莓派3+windows10 IOT cort用到了百度云的人脸识别接口,官方很贴心的给出了C#版的SDK,但是它是基于. net Framework 编写的。然而我所学习的UWP应用是运行在 . net core 上的。 因此我不得不从api开始自力更生。虽然比直接使用SDK要麻烦,但是也因此收获了许多。期间,尤其是对接口返回的Json数据的解析让我苦恼了许久。现在我把过程写下,作为笔记,也希望可以帮到一部分跟我遭遇相似的小伙伴。
因此我就以百度云人脸识别接口返回的json数据来做例子来演示如何获取Json中的数据
人脸注册
当向人脸注册api提交注册信息后,api会视结果返回两类字符串——成功或者不成功。
解析该Json结果时,主要的问题是:你不确定注册是否会成功,因此在解析时也就不能确定究竟该解析哪一类。我所想到的最简单粗暴的方式是:一上来就尝试获取"error_code" 以及" error_msg"的值。如果没有获取到,则会出现异常,因此用try_catch包裹住,在try块里面写注册失败的处理方法,在catch块里面写上注册成功的相应处理方法即可。
// 注册成功
{
"log_id": 73473737,
}
// 注册发生错误
{
"error_code": 216616,
"log_id": 674786177,
"error_msg": "image exist"
* }
C#代码
JObject result ;
try
{
int errorCode = 0;
string errorMsg = "";
errorMsg = result["error_msg"].ToString();
errorCode = Convert.ToInt32(result["error_code"].ToString());
RegistDetailsBlock.Text = "失败!";
switch (errorCode)
{
case 216616: DetailsBlock.Text = "已经存在相同图片"; break;
case 216402:
{
DetailsBlock.Text = "未检测到人脸";
};
break;
case 216100:
{
DetailsBlock.Text = "用户名非法,请检查输入";
UserNameBox.Text = "";
};break;
default: DetailsBlock.Text = errorMsg;
break;
}
}
catch (Exception)
{
RegistDetailsBlock.Text = "成功!";
DetailsBlock.Text = "已成功注册面部信息";
}
resultBlock.Text = result.ToString();
人脸识别
在该Json块中,"result_num"、"log_id" 均很容易获得其值(var value=jsonResult["result_num"]),但是"uid"以及"scores"都藏在result里面,不太容易搞。此时就要使用 JToken 了。定义一个JToken对象 users 然后获取"result" 节点。 users[0] 表示"result"数组的第一个元素。注意此 result 节点其实是一个只有一个元素的JSON数组。接着获取"scores" :users0, 但是仍需注意,此 scores 子节点依然是只有一个元素的JSON数组,因此要获取识别结果的得分需要这样写:
var socre=users[0]["scores"][0];
{
"result": [
{
"uid": "cool",
"scores": [
97.806999206543
],
"group_id": "Test_1",
"user_info": "SB"
}
],
"result_num": 1,
"log_id": 2437804895083015
}
C#代码
JObject jsonResult;
double scores = 0.01;
JToken users = jsonResult["result"];
scores = Convert.ToDouble(users[0]["scores"][0].ToString());
if (scores > 80.0)//说明该人脸的匹配度达标
{
string UserInfo;
UserInfo = users[0]["user_info"].ToString();
ComeInBlock.Text = "识别成功!";
DetailsBlock.Text = "用户为: "+UserInfo;
}
else
{
//do something
}
人脸删除
只就json 结果来看,人脸删除跟人脸注册的处理方法是一样的。因此只放代码喽。
只是在我写我的app的时候,我需要实现多选删除,因此也稍微有必要在这里讲一下
// 删除成功
{
"log_id": 73473737,
}
// 删除发生错误
{
"error_code": 216612,
"log_id": 1382953199,
"error_msg": "user not exist"
}
C#代码
try
{
int num = WhiteListView.SelectedItems.Count;//获取所选择的ListViewItem对象的个数
for (int i = 0; i < num; i++)//遍历所选择的ListViewItem对象
{
//逐个删除
string UID = WhiteListView.SelectedItems[i].ToString();
await faceClient.FaceDelete(UID);
}
RefreshUserList.Visibility = Visibility.Collapsed;
await UpdateWhitelistedVisitorsList();
statusBlock.Text = "已成功删除:" + num.ToString() + " 位用户";
}
catch (Exception)
{
NetProblem();
}
组内用户列表查询
由于要显示一个所有用户的列表,因此用到了组内用户列表查询API。要实现它,与上述的情况相比额外需要一个List<T> , 我用的是List<string>。依然用到了JToken 这点与“人脸识别” 节中用法一致
{
"log_id": 3314921889,
"result_num": 2,
"result": [
{
"uid": "uid1",
"user_info": "user info 1"
},
{
"uid": "uid2",
"user_info": "user info 2"
}
]
}
JObject result = await faceClient.GetGroupUsers();
int num = result["result_num"].Value<Int32>();//用户总数
JToken users = result["result"];
List<string> testlist = new List<string>();
for (int i = 0; i < num; i++)
{
testlist.Add(users[i]["uid"].ToString());//
}
statusBlock.Text = result.ToString();//
WhiteListView.ItemsSource = testlist;
走一步看一步待续吧
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。