ReadAsAsync和JsonConvert之间的区别

14

这适用于所有属性:

string resultAsString = await httpResponseMessage.Content.ReadAsStringAsync();
return await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<ApiData>(resultAsString));

虽然这只适用于其中一部分:

return await httpResponseMessage.Content.ReadAsAsync<ApiData>();

有什么区别?


也许他们正在使用不同的序列化程序? - Mihai Caracostea
1个回答

11
前者从流中异步读取,然后使用线程池线程将JSON字符串反序列化为对象。
后者异步从流中读取,但在从流异步读取后恢复的线程上同步地将JSON字符串转换为对象。
在内部,两种方法都将利用Json.NET来解析数据,因为扩展方法HttpContentExtensions.ReadAsAsync<T>将在内部调用JsonMediaTypeFormatter,这个类使用Json.NET 。
就个人而言,我会选择后者,因为我认为在后台线程上执行序列化没有任何好处。但是,请测试你的代码,看看它是否适用于你。

1
谢谢您的回答。我也认为这两种方法是相同的(使用Json.NET)。让我们去掉这个异步部分,我仍然得到两个不同的结果:string resultAsString = await httpResponseMessage.Content.ReadAsStringAsync(); ApiData res1 = JsonConvert.DeserializeObject<ApiData>(resultAsString); ApiData res2 = await httpResponseMessage.Content.ReadAsAsync<ApiData>(); 我正在使用JsonProperties,这可能会在这里有任何区别吗? - Senj
{"upstream_url":"http://localhost:34001","request_path":"/weather","id":"a897b9cb-d4cd-4eca-ce49-42c75e71e27b","strip_request_path":true,"name":"WebFrontend","created_at":1450446815000}" 这是我的 JSON。使用第一种方法,我可以获取所有填充的内容,但是在后者中只有 ID 和 Name 被填充。 - Senj
@Senj 将你的类结构和 JSON 添加到问题中。 - Yuval Itzchakov
@YuvalItzchakov httpResponseMessage.Content.ReadAsAsync<ApiData>();JsonConvert.DeserializeObject<ApiData>(resultAsString) 不使用相同的反序列化机制。 - gsubiran
@YuvalItzchakov 我理解你的观点,但我有点奇怪,因为我发现使用ReadAsAsyncJsonConvert.DeserializeObject进行反序列化时存在差异。如果API结果中的属性包含空格,在使用第一种选项时,这些属性将无法被反序列化,即使我在类中为这些属性添加了相应的数据注释。你知道为什么会出现这种情况吗? - gsubiran
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接