如何快速从 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.DeserializeObject
和JObject.Parse
。
但是,Visual Studio 调试在这两种方法中停留了很长时间
从巨大的 JSON 响应中获取部分属性的推荐方法是什么?
谢谢
【问题讨论】:
如果辅助方法对您来说不够用,那么唯一的其他选择是使用JsonReader
手动读取 JSON 并提取您想要的位,同时跳过其他和没有给他们额外的处理时间。这也可能不足以满足您的需求,但这是最快的方法。
应该不会那么慢吧,可能延迟是因为在等待请求结果。
@anastaciu,我可以在 _httpClient.GetFromJsonAsync
运行后立即看到 result
值。为什么在我可以看到值的情况下等待请求?
暂停:GetFromJsonAsync
在您的示例中已经返回了一个反序列化的对象。那你为什么要解析它?
好吧,我个人会选择将其反序列化为专门用于保存 JSON 数据的类。当您使用 dynamic
时,JSON.NET 只是在后台反序列化为 JObject
或 JArray
(取决于源数据)。
【参考方案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以上是关于如何快速从 HttpClient 返回的 JSON 中获取部分属性?的主要内容,如果未能解决你的问题,请参考以下文章
HTTPClient 返回 HttpRequestException WinRT