使用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反序列化为生成的类。有时工具会生成坏类,所以要小心。