簡體   English   中英

如何將從 Azure Blob 獲取的內容解析為字典<string, dynamic>使用 C#?

[英]How to parse content get from Azure Blob into Dictionary<string, dynamic> using C#?

我正在嘗試從 Azure 中的鍵值對的 blob 獲取內容,並將它們傳輸到 Dictionary<String, dynamic> 中。 但它倒下了。 我的代碼如下:

static async Task Main()
        {   

            BlobServiceClient blobServiceClient = new BlobServiceClient("#");
            BlobContainerClient containerClient =  blobServiceClient.GetBlobContainerClient("#");
            var blobClient = containerClient.GetBlobClient("#");  
            var response = blobClient.DownloadContent();
            
            var data = response.Value.Content;
            var blobContents = Encoding.UTF8.GetString(data);
            var options = new JsonSerializerOptions { WriteIndented = true };
            var jsonString = System.Text.Json.JsonSerializer.Serialize(blobContents, options);
            Dictionary<string, dynamic>? values = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonString);
}

但它表明:

unhandled exception. Newtonsoft.Json.JsonSerializationException: Error converting value "{"key":"value","...} to type 'System.Collections.Generic.Dictionary`2[System.String,System.Object]'. Path '', line 1, position 104484.

我想知道如何解決它。謝謝!

    private async Task<string> GetBlob(BlobClient blobClient)
    {
        string file = string.Empty;
        MemoryStream fileStream = new MemoryStream();

        try
        {
            using (var stream = new MemoryStream())
            {
                await blobClient.DownloadToAsync(stream).ConfigureAwait(false);

                if (stream != null)
                {

                    stream.WriteTo(fileStream);
                    fileStream.Position = 0;

                    StreamReader reader = new StreamReader(fileStream);
                    file = reader.ReadToEnd();
                }

            }

            return file;
        }
        catch (Exception)
        {
            return string.Empty;
        }

    }
}

我認為問題在於您混合了不同的庫(Newtonsoft.Json 和 System.Text.Json)。

我使用兩者都做了一個文本,它們工作正常。

System.Text.Json:

using System;
using System.Text.Json;
using System.Collections;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        string json = "{\"systemId\":\"P0700055\",\"sessionId\":\"ec322078-8934-441e-a090-9c43e255ccf7\",\"startDateTime\":\"2021-04-10T00:13:13.0008388+00:00\",\"timeSpanSec\":30,\"span\":\"00:00:30\",\"signals\":[]}";
        var values =  JsonSerializer.Deserialize<Dictionary<string, dynamic>>(json);
        
        foreach(var kvp in values)
            Console.WriteLine(kvp.Value.ToString());
            
    }
}

牛頓軟件.Json

using System;
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        string json = "{\"systemId\":\"P0700055\",\"sessionId\":\"ec322078-8934-441e-a090-9c43e255ccf7\",\"startDateTime\":\"2021-04-10T00:13:13.0008388+00:00\",\"timeSpanSec\":30,\"span\":\"00:00:30\",\"signals\":[]}";
        var values = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
        
        foreach(var kvp in values)
            Console.WriteLine(kvp.Value.ToString());
            
    }
}

要修復錯誤,只需刪除以下 2 行代碼:

var options = new JsonSerializerOptions { WriteIndented = true };
var jsonString = System.Text.Json.JsonSerializer.Serialize(blobContents, options);

並替換以下代碼行:

Dictionary<string, dynamic>? values = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonString);

Dictionary<string, dynamic>? values = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(blobContents);

所以你的代碼會是這樣的:

static async Task Main()
        {   

            BlobServiceClient blobServiceClient = new BlobServiceClient("#");
            BlobContainerClient containerClient =  blobServiceClient.GetBlobContainerClient("#");
            var blobClient = containerClient.GetBlobClient("#");  
            var response = blobClient.DownloadContent();
            
            var data = response.Value.Content;
            var blobContents = Encoding.UTF8.GetString(data);
            
            Dictionary<string, dynamic>? values = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(blobContents);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM