查询具有未知结构的JSON

时间:2014-01-30 11:06:59

标签: c# json

我们正在尝试编写一种方法来使用来自第三方的JSON提要,但遗憾的是它写得不好,似乎没有关于有时存在或不存在的规则,并且结构也会根据键而变化,I无法改变这一点,我们必须与我们拥有的东西合作。我们基于某些键知道我们想要什么,但是当嵌套结构发生变化时,我们很难找到它们。

是否可以将JSON展平为单个列表>我们可以查询,密钥将是包含父项的完全限定名称,因此以下JSON:

{
  "employees": [
     { "firstName":"John" , "lastName":"Doe" }, 
     { "firstName":"Anna" , "lastName":"Smith" }, 
     { "firstName":"Peter" , "lastName":"Jones" }
     ]
}

将成为包含以下键的列表:

"employees.firstName" and a value of "John".

我认为如果我们能够实现这一目标,我们可以查询数据以获得我们想要的东西,我们一直在尝试使用动态对象,但正如我所说,JSON更改和属性有时会丢失,并且证明无法处理所有方案。

1 个答案:

答案 0 :(得分:0)

如果您不确切知道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);
   }

}