在C#中从JSON中提取值

时间:2017-12-06 10:07:52

标签: c# json

我正在开发一个检测车牌的应用程序并向我提供有关它们的信息。这是通过调用名为“openALPR”的Rest API来完成的。 结果我得到一个如下所示的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!

1 个答案:

答案 0 :(得分:1)

首先为您的REST API输出制作C#Model类,如下所示:

enter image description here

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);
       }
 }