1

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!

4
  • Possible duplicate of Extracting part of JSON response Commented Dec 6, 2017 at 10:10
  • use json2csharp to get the classes , then deserialize using newtonsoft.json Commented Dec 6, 2017 at 10:13
  • 1
    @Coder1409 do you even need to do the first part, if all you're interested in is the values? it can be accessed dynamically, or via "stringly typed" methods, newtonsoft's generic JObject classes etc.. Commented Dec 6, 2017 at 10:26
  • Give an example of the desired output. Commented Dec 6, 2017 at 10:38

1 Answer 1

2

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);
       }
 }
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.