簡體   English   中英

在C#中從JSON提取值

[英]Extracting values from JSON in C#

我正在開發可檢測車牌並向我提供有關車牌信息的應用程序。 這是通過調用Rest API(稱為“ openALPR”)來完成的。 結果,我得到一個看起來像這樣的JSON字符串:

{
  "uuid": "",
  "data_type": "alpr_results",
  "epoch_time": 1512554543436,
  "processing_time": {
    "plates": 145.41024780273438,
    "total": 147.6409999995667
  },
  "img_height": 233,
  "img_width": 700,
  "results": [
    {
      "plate": "MTF5101",
      "confidence": 94.978622436523438,
      "region_confidence": 0,
      "vehicle_region": {
        "y": 1,
        "x": 234,
        "height": 232,
        "width": 232
      },
      "region": "fr",
      "plate_index": 0,
      "processing_time_ms": 193.28457641601563,
      "candidates": [
        {
          "matches_template": 0,
          "plate": "MTF5101",
          "confidence": 94.978622436523438
        }
      ],
      "coordinates": [
        {
          "y": 102,
          "x": 289
        },
        {
          "y": 101,
          "x": 412
        },
        {
          "y": 126,
          "x": 412
        },
        {
          "y": 128,
          "x": 289
        }
      ],
      "matches_template": 0,
      "requested_topn": 50
    },
    {
      "plate": "MHV7718",
      "confidence": 94.9754638671875,
      "region_confidence": 0,
      "vehicle_region": {
        "y": 0,
        "x": 395,
        "height": 233,
        "width": 233
      },
      "region": "fr",
      "plate_index": 1,
      "processing_time_ms": 193.28457641601563,
      "candidates": [
        {
          "matches_template": 0,
          "plate": "MHV7718",
          "confidence": 94.9754638671875
        },
        {
          "matches_template": 0,
          "plate": "MH7718",
          "confidence": 81.550361633300781
        },
        {
          "matches_template": 0,
          "plate": "MHY7718",
          "confidence": 81.411224365234375
        }
      ],
      "coordinates": [
        {
          "y": 142,
          "x": 475
        },
        {
          "y": 148,
          "x": 676
        },
        {
          "y": 184,
          "x": 674
        },
        {
          "y": 178,
          "x": 475
        }
      ],
      "matches_template": 0,
      "requested_topn": 50
    },
    {
      "plate": "MTG7780",
      "confidence": 94.97296142578125,
      "region_confidence": 0,
      "vehicle_region": {
        "y": 1,
        "x": 91,
        "height": 232,
        "width": 232
      },
      "region": "fr",
      "plate_index": 2,
      "processing_time_ms": 193.28457641601563,
      "candidates": [
        {
          "matches_template": 0,
          "plate": "MTG7780",
          "confidence": 94.97296142578125
        },
        {
          "matches_template": 0,
          "plate": "MT7780",
          "confidence": 81.548896789550781
        },
        {
          "matches_template": 0,
          "plate": "MT67780",
          "confidence": 81.409553527832031
        }
      ],
      "coordinates": [
        {
          "y": 84,
          "x": 18
        },
        {
          "y": 96,
          "x": 202
        },
        {
          "y": 140,
          "x": 201
        },
        {
          "y": 128,
          "x": 16
        }
      ],
      "matches_template": 0,
      "requested_topn": 50
    }
  ],
  "credits_monthly_used": 48,
  "version": 2,
  "credits_monthly_total": 2000,
  "error": false,
  "regions_of_interest": [],
  "credit_cost": 1
}

現在我需要獲取每個車牌的坐標。 在此示例中,有3個車牌。 每個“坐標”鍵都包含四個點(x,y)。

如何在C#中獲取這些坐標?

感謝您查看我的問題!

最好的問候,Fabian Maurhart!

首先,為您的REST API輸出創建C#Model類,如下所示:

在此處輸入圖片說明

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JSONConversion.Models
{

    public class LicensePlateInformation
    {
        public string uuid { get; set; }
        public string data_type { get; set; }
        public long epoch_time { get; set; }
        public Processing_Time processing_time { get; set; }
        public int img_height { get; set; }
        public int img_width { get; set; }
        public List<Result> results { get; set; }
        public int credits_monthly_used { get; set; }
        public int version { get; set; }
        public int credits_monthly_total { get; set; }
        public bool error { get; set; }
        public object[] regions_of_interest { get; set; }
        public int credit_cost { get; set; }
    }

    public class Processing_Time
    {
        public float plates { get; set; }
        public float total { get; set; }
    }

    public class Result
    {
        public string plate { get; set; }
        public float confidence { get; set; }
        public int region_confidence { get; set; }
        public Vehicle_Region vehicle_region { get; set; }
        public string region { get; set; }
        public int plate_index { get; set; }
        public float processing_time_ms { get; set; }
        public Candidate[] candidates { get; set; }
        public List<Coordinate> coordinates { get; set; }
        public int matches_template { get; set; }
        public int requested_topn { get; set; }
    }

    public class Vehicle_Region
    {
        public int y { get; set; }
        public int x { get; set; }
        public int height { get; set; }
        public int width { get; set; }
    }

    public class Candidate
    {
        public int matches_template { get; set; }
        public string plate { get; set; }
        public float confidence { get; set; }
    }

    public class Coordinate
    {
        public int y { get; set; }
        public int x { get; set; }
    }
}

之后,通過發出如下的GET請求,從API中獲取JSON數據:

using System.Net.Http;
using Newtonsoft.Json;

public async Task<LicensePlateInformation> GetLicensePlateInfoFromAPI()
{
   try
   {
    string stringifiedJSONFromAPI = string.Empty;
    LicensePlateInformation plateInfo = new LicensePlateInformation();
    using(HttpClient client = new HttpClient())
    {
       client.DefaultRequestHeaders.Accept.Clear();
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

       HttpResponseMessage msg = await client.GetAsync($"<Insert rest api endpoint here>");

       if(msg.IsSuccessStatusCode)
       {
          stringifiedJSONFromAPI = await msg.Content.ReadAsStringAsync();
          JsonConvert.PopulateObject(stringifiedJSONFromAPI, plateInfo);
       }
       return plateInfo;
    }
   }
   catch(Exception ex)
   {
      throw;
   }
}

最后,在獲得C#模型類之后,只需應用LINQ即可獲取所有詳細信息:

using System.Linq;
using System.Collections.Generic;

LicensePlateInformation plateInfo = await GetLicensePlateInfoFromAPI();
List<Coordinate> coOrdinatesList = new List<Coordinate>();
 foreach (var outerItem in plateInfo.results.Select(x => x.coordinates))
 {
       foreach (var innerItem in outerItem)
       {
          coOrdinatesList.Add(innerItem);
       }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM