下载blob存储并返回Json对象

Lui*_*eri 5 c# json memorystream azure azure-storage-blobs

我想下载一个.json,我已经储存在容器中的BLOB Azure StorageNewtonsoft.Json它写的一个对象.

我这样做是通过调用:

(CloudBlockBlob) blob.DownloadToStream(stream);
Run Code Online (Sandbox Code Playgroud)

然而,而不是在本地的应用程序目录中的数据流写入文件,我希望返回JSON objectJson(result)

这是我尝试过的:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后我的jsonTextReader变量是空的和对象null

我该怎么做才能做到这一点?

谢谢

Gau*_*tri 12

0在将blob读入流后,请将流的位置重置为.所以你的代码是:

        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);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 始终指定示例中使用的库 - 添加使用;) (2认同)

Tod*_*ier 5

问题和已接受的答案都始于将整个流复制到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);
}
Run Code Online (Sandbox Code Playgroud)