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

Posted

技术标签:

【中文标题】如何快速从 HttpClient 返回的 JSON 中获取部分属性?【英文标题】:How to get partial properties from JSON returned from HttpClient fast? 【发布时间】:2021-06-30 08:21:49 【问题描述】:

我有一个 JSON sn-p here 取自 C# .NET 5 程序中的 HttpClient 类。

简化的 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 数组中获取以下每家餐厅的信息:

    姓名 评分 美食类型

我使用dynamic,因为我不需要基于 JSON 结构创建多个类,并且如果 JSON 结构发生变化,我也不需要更改我的类。

我已经尝试过JsonConvert.DeserializeObjectJObject.Parse

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

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

谢谢

【问题讨论】:

如果辅助方法对您来说不够用,那么唯一的其他选择是使用 JsonReader 手动读取 JSON 并提取您想要的位,同时跳过其他和没有给他们额外的处理时间。这也可能不足以满足您的需求,但这是最快的方法。 应该不会那么慢吧,可能延迟是因为在等待请求结果。 @anastaciu,我可以在 _httpClient.GetFromJsonAsync 运行后立即看到 result 值。为什么在我可以看到值的情况下等待请求? 暂停:GetFromJsonAsync 在您的示例中已经返回了一个反序列化的对象。那你为什么要解析它? 好吧,我个人会选择将其反序列化为专门用于保存 JSON 数据的类。当您使用 dynamic 时,JSON.NET 只是在后台反序列化为 JObjectJArray(取决于源数据)。 【参考方案1】:

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

    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 的实例,然后您就有了所需的类型。而已。 您需要有一个包含餐厅列表的类,因为您必须有一个与您的 json 对象同名的属性

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

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

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

【讨论】:

你能举例说明如何用你的代码反序列化吗? JSON中的其他属性会在反序列化过程中被丢弃吗? 你需要一个包含餐厅列表的类,因为你必须有一个与你的 json 对象同名的属性 class RestaurantList public List Restaurants get; set; 现在你需要一个代码来将 json 部分绑定到对象 var restaurant = JsonConvert.DeserializeObject(result);

以上是关于如何快速从 HttpClient 返回的 JSON 中获取部分属性?的主要内容,如果未能解决你的问题,请参考以下文章

从 HTTPClient 响应中解压 GZip 流

如何从 httpclient 调用中获取内容正文?

如何从 HttpClient 解析 JSON 字符串?

HTTPClient 返回 HttpRequestException WinRT

如何在 Android 中使用 HTTPClient 以 JSON 格式发送 POST 请求?

httpclient以json形式参数调用http接口并解析返回的报文