遍歷JObject中的Json資料(以百度雲人臉識別api返回的JSON資料為例)

且慢不聽發表於2017-09-24

遍歷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;

走一步看一步待續吧

相關文章