如何快速获取从 HttpClient 返回的 JSON 的部分属性?

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

我在下面的 C# .NET 5 程序中有一个 JSON 片段 here 取自 HttpClient class。

简化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"
                }
            ]
        }
    ]
}

当前代码:

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

我有兴趣从 Restaurants 数组中获取以下每家餐厅的信息:

  1. 姓名
  2. 评分
  3. 餐饮类型

我使用 dynamic 因为我不需要基于 JSON 结构创建多个 class 并且我不需要更改我的 class 如果JSON 结构更改。

我试过了 JsonConvert.DeserializeObject & JObject.Parse.

但是,Visual Studio 调试在这两种方法中停留了很长时间

从巨大的 JSON 响应中获取部分属性的推荐方法是什么?

谢谢

您可以创建一个具有命名属性的 class

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

并将 json 反序列化为 Restaurant 的实例,然后您就有了所需的类型。而已。 您需要有一个 class 包含餐厅列表,因为您必须有一个 属性 与您的 json 对象

相同的名称
class RestaurantList { public List<Restaurant> Restaurants {get; set;} } 

现在您需要一个代码来将 json 的部分绑定到对象

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