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

时间:2016-03-30 10:39:08

标签: c# json visual-studio c#-4.0 json.net

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

我目前正在尝试反序列化一个以多个级别格式呈现的大型JSON字符串 - 我的目标是将一些数据存储在一个平面数据库表中,通过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" 

e.g。

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

读取一个基本的JSON字符串很简单,但是我使用JSON是一个新手,让我对如何解决这个问题感到困惑。

2 个答案:

答案 0 :(得分:1)

我们可以通过首先定义几个类来反序列化您的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

答案 1 :(得分:0)

来自JSON的网站json2csharp.com generete类,您的示例不是有效的JSON。并将您的JSON反序列化为生成的类。 有时工具会生成错误的类,所以要小心。