【问题标题】:Deserializing a JSON string formatted as a dictionary反序列化格式化为字典的 JSON 字符串
【发布时间】:2016-03-30 10:39:07
【问题描述】:

使用 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。以上无效。
  • 您的 Json 无效,您在 "products: 后缺少双引号

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


【解决方案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&lt;string, Company&gt;

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢链接 - 是的,包含“..”表示其他可能的数据项。该字符串不应按原样解析。我使用的字符串大小为 16MB,您链接的那个网站和它所基于的工具都不能处理这么多信息 - 我会试着去掉一些日期,然后再试一次。
    猜你喜欢
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多