遍歷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;
走一步看一步待續吧