问题 ReadAsAsync和JsonConvert之间的区别


这适用于所有属性:

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

虽然这只适用于其中一些:

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

有什么不同?


1188
2017-12-18 11:46


起源

也许他们正在使用不同的序列化器? - Mihai Caracostea


答案:


前者读到 从流中异步,然后使用线程池线程将JSON字符串反序列化为对象。

后者从流中异步读取,但将JSON字符串转换为对象 同步,在等待从流中异步读取后恢复的线程上。

在内部,两种方法都将利用Json.NET来解析数据,作为扩展方法 HttpContentExtensions.ReadAsAsync<T> 会在内部打电话给 JsonMediaTypeFormatter,它使用Json.NET。

就个人而言,我会使用后者,因为我认为在后台线程上执行序列化没有任何好处。但是,测试您的代码,看看它是否适合您。


11
2017-12-18 12:04



谢谢你的回答。我还认为两种方法都是一样的(使用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和名称被填充。 - Senj
@Senj在问题中添加类结构和JSON。 - Yuval Itzchakov
@Senj你解决了吗? - gsubiran
@gsubiran有什么可以解决的? - Yuval Itzchakov