Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查询结构未知的JSON_C#_Json - Fatal编程技术网

C# 查询结构未知的JSON

C# 查询结构未知的JSON,c#,json,C#,Json,我们正在尝试编写一种方法来使用来自第三方的JSON提要,但不幸的是,它没有很好地编写,似乎没有关于有时有什么或没有什么的规则,而且结构也会根据键的不同而变化,我没有办法改变这一点,我们必须使用现有的内容。我们知道基于某些键需要什么,但随着嵌套结构的更改,我们正在努力找到它们 是否可以将JSON简化为一个列表>,我们可以查询该列表,并且键将是包含父项的完全限定名,因此以下JSON: { "employees": [ { "firstName":"John" , "lastName":

我们正在尝试编写一种方法来使用来自第三方的JSON提要,但不幸的是,它没有很好地编写,似乎没有关于有时有什么或没有什么的规则,而且结构也会根据键的不同而变化,我没有办法改变这一点,我们必须使用现有的内容。我们知道基于某些键需要什么,但随着嵌套结构的更改,我们正在努力找到它们

是否可以将JSON简化为一个列表>,我们可以查询该列表,并且键将是包含父项的完全限定名,因此以下JSON:

{
  "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。