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



使用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

Fiddle:https://dotnetfiddle.net/FpK7AN

在网站json2csharp.com上,从您的JSON生成类,您的示例不是有效的JSON。并将JSON反序列化为生成的类。有时工具会生成坏类,所以要小心。

相关内容

  • 没有找到相关文章

最新更新