C# 查询结构未知的JSON
我们正在尝试编写一种方法来使用来自第三方的JSON提要,但不幸的是,它没有很好地编写,似乎没有关于有时有什么或没有什么的规则,而且结构也会根据键的不同而变化,我没有办法改变这一点,我们必须使用现有的内容。我们知道基于某些键需要什么,但随着嵌套结构的更改,我们正在努力找到它们 是否可以将JSON简化为一个列表>,我们可以查询该列表,并且键将是包含父项的完全限定名,因此以下JSON:C# 查询结构未知的JSON,c#,json,C#,Json,我们正在尝试编写一种方法来使用来自第三方的JSON提要,但不幸的是,它没有很好地编写,似乎没有关于有时有什么或没有什么的规则,而且结构也会根据键的不同而变化,我没有办法改变这一点,我们必须使用现有的内容。我们知道基于某些键需要什么,但随着嵌套结构的更改,我们正在努力找到它们 是否可以将JSON简化为一个列表>,我们可以查询该列表,并且键将是包含父项的完全限定名,因此以下JSON: { "employees": [ { "firstName":"John" , "lastName":
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
将成为一个包含以下键的列表:
"employees.firstName" and a value of "John".
我认为,如果我们能够做到这一点,我们可以查询数据以获得我们想要的,我们一直在尝试使用动态对象,但正如我所说的,JSON更改和属性有时会丢失,并且不可能处理所有场景。如果您不可靠地知道JSON的结构,但您确定属性名称,例如“firstName”. 您可以使用JSON.NET JObject并递归地遍历它,检查您要查找的属性是否存在于当前JToken中 代码应该是这样的,请注意,我没有编译的代码可能有一些键入错误:
private List<string> LoadFirstNames(string json)
{
JObject o = JObject.Parse(json);
List<string> firstNames = new List<string>();
foreach(var token in o.GetPropertyValues())
{
FindFirstName(token, firstNames);
}
return firstNames;
}
private void FindFirstName(JToken currentProperty, List<string> firstNamesCollection)
{
if(currentProperty == null)
{
return;
}
if(currentProperty["firstName"] != null)
{
firstNamesCollection.Add(currentProperty["firstName"]);
}
foreach(var token into currentProperty.Values())
{
FindFirstName(token , firstNamesCollection);
}
}
private List LoadFirstNames(字符串json)
{
JObject o=JObject.Parse(json);
List firstNames=新列表();
foreach(o.GetPropertyValues()中的var标记)
{
FindFirstName(令牌、名字);
}
返回名字;
}
私有void FindFirstName(JToken currentProperty,List FirstNames集合)
{
如果(currentProperty==null)
{
返回;
}
如果(currentProperty[“firstName”]!=null)
{
添加(currentProperty[“firstName”]);
}
foreach(将变量标记转换为currentProperty.Values())
{
FindFirstName(令牌,第一个名称集合);
}
}
您可以解析字典中的任何json
这样您就可以员工[“firstName”]
是“John”
这是一个非常简化的解决方案,不幸的是,我们得到的json有时嵌套了10层,正如我所说的,我们并不总是知道它会是什么样子,但属性名称已经设置好了,因此,如果我们可以得到一个带有键“level1.level2.level3.level4.level5.firstName”的字符串,那么我们就可以查询“firstName”。你可以看到关于和JSON.net这让我得到了正确的答案,虽然我在检查值是否为null时仍然遇到异常,并且它不存在于动态对象中,因此必须创建一个方法来包装try…catch,如果出现错误,则返回false。