Search code examples
c#json.netparsingdotnet-httpclient

How to get partial properties from JSON returned from HttpClient fast?


I have a JSON snippet here taken from HttpClient class below in a C# .NET 5 program.

Simplified JSON:

{
    "Restaurants":
    [
        {
            "Id": 138898,
            "Name": "Willesborough Cafe",
            "Rating": {
                "Count": 76,
                "Average": 5.92,
                "StarRating": 5.92
            },
            "CuisineTypes": [
                {
                    "Id": 92,
                    "IsTopCuisine": false,
                    "Name": "Breakfast",
                    "SeoName": "breakfast"
                }, {
                    "Id": 106,
                    "IsTopCuisine": true,
                    "Name": "British",
                    "SeoName": "british"
                }
            ],
            "Cuisines": [
                {
                    "Name": "Breakfast",
                    "SeoName": "breakfast"
                }, {
                    "Name": "British",
                    "SeoName": "british"
                }
            ]
        }
    ]
}

Current code:

            dynamic result =
                await _httpClient.GetFromJsonAsync<dynamic>(url);
            // dynamic result2 = JsonConvert.DeserializeObject<dynamic>(result); // slow
            dynamic result2 = JObject.Parse(result); // slow

I am interested to get the info from each restaurant below from the Restaurants array:

  1. Name
  2. Rating
  3. CusineType

I use dynamic as I do not need to create multiple classes based on the JSON structure & I do not need to change my class if the JSON structure changes.

I have tried JsonConvert.DeserializeObject & JObject.Parse.

However, the Visual Studio debugging stuck at either of the method for a very long period

What is the recommended method to get partial properties from a huge JSON response?

Thanks


Solution

  • You can make a class with named properties

        class Restaurant
    {
        public string Name { get; set; }
    
        public Rating Rating { get; set; }
    
        public List<CuisineType> CuisineTypes { get; set; }
    }
    
    class Rating
    {
        public int Count { get; set; }
        public decimal Average { get; set; }
        public decimal StarRating { get; set; }
    }
    
    class CuisineType
    {
        public int Id { get; set; }
        public bool IsTopCuisine { get; set; }
        public string Name { get; set; }
        public string SeoName { get; set; }
    }
    

    and deserialize json to instance of Restaurant then you have a type you need. That's it. You need to have a class contains list of Restaurant, because you must have a property equal name with your json object

    class RestaurantList { public List<Restaurant> Restaurants {get; set;} } 
    

    Now you need a code to bind section of json to object

    var restaurants = JsonConvert.DeserializeObject<RestaurantList>(result);