Fabian Maurhart
Fabian Maurhart

Reputation: 31

Extracting values from JSON in C#

I am working on an application that detects license plates and give me information about them. This is done by calling an Rest API called "openALPR". As a result i get an JSON string looking like this:

{
  "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
}

Now i need to get the coordinates for every license plate. In this example there are 3 license plates. Each "coordinate" key includes four points (x,y).

How do I get these coordinates in C#?

Thanks for looking at my question!

With best regards, Fabian Maurhart!

Upvotes: 1

Views: 1954

Answers (1)

Kunal Mukherjee
Kunal Mukherjee

Reputation: 5853

For starters make C# Model classes for your REST API output like this:

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

After that get your JSON data from your API by making a GET request like this:

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

Finally, after getting the C# model class, just apply LINQ to fetch all your details:

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

Upvotes: 2

Related Questions