使用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是一个新手,让我对如何解决这个问题感到困惑。
答案 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
答案 1 :(得分:0)
来自JSON的网站json2csharp.com generete类,您的示例不是有效的JSON。并将您的JSON反序列化为生成的类。 有时工具会生成错误的类,所以要小心。