我们正在尝试编写一种方法来使用来自第三方的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更改和属性有时会丢失,并且证明无法处理所有方案。
答案 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);
}
}