簡體   English   中英

反序列化格式化為字典的JSON字符串

[英]Deserializing a JSON string formatted as a dictionary

使用C#(.Net 4.6)和JSON.NET

我目前正在嘗試反序列化以多種級別的格式呈現的大型JSON字符串-我的目標是將其中一些數據存儲在平面DB表中,通過C#類在所需的數據庫中構建數據將寫回到每一行的格式。

這是字符串格式的示例(為增加可讀性而組成的數據加上換行符):

{
    "Microsoft":
    {
        "name" : "Microsoft",
        "products" : ["Word", "Excel", ["TestThis","TestOrThis"]],
        "employees" : 
        [
            {"John" :{"name" :  "John","skills" : ["Support", "Programming"]}}, 
            {"Dave":{"name" :  "Dave", "skills" : ["Tester"]}}
        ]
    }
}

我最終想要得到的是一個數據庫行,其中僅包含部分此類信息,內容如下:

"Company Name", "Employee Name" 

例如

"Microsoft", "John"
"Microsoft", "Dave"
"IBM", "Ted"

讀取基本的JSON字符串很容易,但是使用JSON是我的新手,這讓我很困惑如何進行分解。

我們可以通過首先定義幾個這樣的類來反序列化您的JSON:

class Company
{
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("employees")]
    public List<Dictionary<string, Employee>> Employees { get; set; }
}

class Employee
{
    [JsonProperty("name")]
    public string Name { get; set; }
}

然后我們可以反序列化為Dictionary<string, Company>如下所示:

var companies = JsonConvert.DeserializeObject<Dictionary<string, Company>>(json);

您會注意到,無論鍵在JSON中有何變化(例如公司名稱和員工名稱),我們都需要使用Dictionary代替靜態類。 此外,我們可以省略為我們不感興趣的項目(例如產品和技能)定義屬性的步驟。

一旦擁有反序列化的公司,我們就可以遍歷結果以達到所需的輸出,如下所示:

foreach(KeyValuePair<string, Company> kvp in companies)
{
    foreach (Dictionary<string, Employee> employees in kvp.Value.Employees)
    {
        foreach (KeyValuePair<string, Employee> kvp2 in employees)
        {
            Console.WriteLine(kvp.Value.Name + ", " + kvp2.Value.Name);
        }
    }
}

輸出:

Microsoft, John
Microsoft, Dave

小提琴: https : //dotnetfiddle.net/FpK7AN

在您的JSON站點json2csharp.com上的通用類上,您的示例不是有效的JSON。 並將您的JSON反序列化為生成的類。 有時工具會生成錯誤的類,因此請當心。

暫無
暫無

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

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