下载 Blob 存储并返回 Json 对象

本文关键字:Json 对象 返回 Blob 存储 下载 | 更新日期: 2023-09-27 18:30:58

我正在尝试下载存储在Azure Storage容器中的.json blob,并使用Newtonsoft.Json将其写入对象。

我通过致电

(CloudBlockBlob) blob.DownloadToStream(stream);

但是,我想在执行Json(result)返回 json object,而不是将流写入本地应用程序目录中

的文件

这是我尝试过的:

using (var stream = new MemoryStream())
{
    blob.DownloadToStream(stream);
    var serializer = new JsonSerializer();
    using (var sr = new StreamReader(stream))
    {
        using (var jsonTextReader = new JsonTextReader(sr))
        {
            result = serializer.Deserialize(jsonTextReader);
        }
    }
}

最后,我的jsonTextReader变量为空,对象null

我该怎么做才能完成此操作?

谢谢

下载 Blob 存储并返回 Json 对象

问题和接受的答案都首先将整个流复制到一个MemoryStream中,该实际上是内存中的大字节数组。此步骤是不必要的 - 将 blob 数据直接流式传输到对象而不先缓冲字节会更节省内存:

using (var stream = await blob.OpenReadAsync())
using (var sr = new StreamReader(stream))
using (var jr = new JsonTextReader(sr))
{
    result = JsonSerializer.CreateDefault().Deserialize<T>(jr);
}
请在将

blob 读入流后将流的位置重置为 0。所以你的代码将是:

        using (var stream = new MemoryStream())
        {
            blob.DownloadToStream(stream);
            stream.Position = 0;//resetting stream's position to 0
            var serializer = new JsonSerializer();
            using (var sr = new StreamReader(stream))
            {
                using (var jsonTextReader = new JsonTextReader(sr))
                {
                    var result = serializer.Deserialize(jsonTextReader);
                }
            }
        }

如果您不关心流媒体并且想要一种简短的方式:

var json = await blockBlob.DownloadTextAsync();
var myObject = JsonConvert.DeserializeObject<MyObject>(json);