Xamarin Forms 使用 httpclient 下载 json 文件:ReadAsStringAsync 还是 DownloadFileAsync?

Posted

技术标签:

【中文标题】Xamarin Forms 使用 httpclient 下载 json 文件:ReadAsStringAsync 还是 DownloadFileAsync?【英文标题】:Xamarin Forms download a json file with httpclient : ReadAsStringAsync or DownloadFileAsync? 【发布时间】:2020-08-29 16:37:57 【问题描述】:

我使用 json 文件在 Xamarin Forms android/ios 应用程序中填充列表视图,并且喜欢在启动时下载 json 文件。

使用 ReadAsStringAsync 还是 DownloadFileAsync 哪个更好?

DownloadFileAsync 不只适用于二进制文件?螺母可能最快然后读取字符串并写入它:)

谢谢

【问题讨论】:

对于 JSON,将其读取为字符串。如果序列化程序支持字节数组,则读取为字节。 【参考方案1】:

通常您希望下载 JSON 内容并直接反序列化为模型。例如:

private sealed class YourModel

    public int SomeProperty  get; set; 
    public string SomeOtherProperty  get; set; 


using (var req = await _httpClient.GetAsync("https://www.example.com/api/endpoint"))

    req.EnsureSuccessStatusCode();
    using (var s = await req.Content.ReadAsStreamAsync())
    using (var sr = new StreamReader(s))
    using (var jtr = new JsonTextReader(sr))
    
        var obj = new JsonSerializer().Deserialize<YourModel>();
    

您可以使用一些扩展来简化此操作,例如,如果您导入了 System.Net.Http.HttpClientExtensions nuget 包,那么您可以这样做:

using (var req = await _httpClient.GetAsync("https://www.example.com/api/endpoint"))

    EnsureSuccessStatusCode();
    var obj = await req.Content.ReadAsAsync<YourModel>();

如果您不想使用模型,则通常会将 JSON 内容下载为 string

【讨论】:

【参考方案2】:

如果您要将数据作为文件直接保存到磁盘,请使用 DownloadFileAsync() - 这将是比ReadAsStringAsync() 更简单、更快速的解决方案,因为DownloadFileAsync() 将使用流将内容写入文件,而不是首先将网络数据作为字符串读取并使用StreamWriter 将其写入文件流。

String 对性能没有好处。即使您想直接以代码解析从网络下载的 JSON 内容而不是保存在磁盘上,您也可以使用 ReadAsStreamAsync() 读取响应,然后使用 JsonSerializer 反序列化 JSON 对象。

【讨论】:

以上是关于Xamarin Forms 使用 httpclient 下载 json 文件:ReadAsStringAsync 还是 DownloadFileAsync?的主要内容,如果未能解决你的问题,请参考以下文章

如果调用方未使用 Xamarin.Forms,Xamarin 依赖项服务能否正常工作?

如何使用 Xamarin.Forms 创建抽屉/滑块菜单?

在 Xamarin.Forms 中使用 Android 绑定

Xamarin.Forms:Forms.Context 已过时

Xamarin.Forms 手势密码实现

Xamarin.Forms - 使用 Xamarin.Essentials 在两个坐标之间获取里程