下载blob存储并返回Json对象

bwntbbo3  于 2023-10-21  发布在  其他
关注(0)|答案(4)|浏览(99)

我试图下载一个.json blob,我已经存储在Azure Storage的容器中,使用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
我能做些什么来实现这一点?
谢谢你

ca1c2owp

ca1c2owp1#

问题和接受的答案都是从将整个流复制到MemoryStream中开始的,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);
}
tpxzln5u

tpxzln5u2#

请在将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);
                }
            }
        }
wyyhbhjk

wyyhbhjk3#

如果你不喜欢流媒体,想要一个简短而简洁的方式:

var json = await blockBlob.DownloadTextAsync();

var myObject = JsonConvert.DeserializeObject<MyObject>(json);
kfgdxczn

kfgdxczn4#

多年来,Azure.Storage.Blobs库一直是一个不断变化的目标。以下是截至10月的最新数据。2023.

BlobDownloadResult downloadResult = await blockBlob.DownloadContentAsync();
var plainTextResult = downloadResult.Content.ToString();
var myObject = JsonConvert.DeserializeObject<MyObject>(plainTextResult);

相关问题