2016-02-29 81 views
-2

我不想写循环..我想看到可用的所有选项(使用LINQ,SelectTokens,JSON.NET或任何其他的一些工具),让我/一个数组对象相对于返回东西在里面。例如:如何查询json子对象并返回整个父对象?

{ 
    "theFamilies": [{ 
     "parent1": "Joe", 
     "parent2": "Mary", 
     "child1": "Andy" 
    }, { 
     "parent1": "Bob", 
     "parent2": "Mary", 
     "child1": "Mark" 
    }] 
} 

返回整个对象(一个或多个),它们包含"parent2" = "Mary"的列表。

如果..嵌套被更深层次的?有没有一种很好的方法来避免/忽略嵌套深度,并递归地获得满足条件的所有条件,而不需要任何编码更改?

有关利益或每个解决方案的利弊任何评论都将特别赞赏。

回答

-2

您的数据似乎是Family对象的数组。您可以为此创建一个poco,并使用LINQ在将json反序列化为C#类型之后选择匹配。喜欢的东西可以使用如下 -

 var t = JsonConvert.DeserializeObject<Families>("json"); 

     var match = t.theFamilies.Where(a => a.parent2 == "Mary").ToList(); 

     public class Families 
     { 
      public List<Family> theFamilies { get; set; } 

     } 

     public class Family 
     { 
      public string parent1 { get; set; } 
      public string parent2 { get; set; } 
      public string child1 { get; set; } 
     } 
+0

_ “如果...嵌套更深?有没有避免的好方法/忽略嵌套深度和递归得到所有的满足,不需要任何编码改变的条件“_ _ – CodeCaster

+0

”如果..嵌套被更深层次的“_ - ?以何种方式 –

+1

我不? “知道,我不是OP。你的回答但不回答这个问题。 – CodeCaster

1

我猜你正在寻找Json.NET SelectToken

你的情况:

var o = JObject.Parse("{'theFamilies': [{'parent1': 'Joe','parent2': 'Mary','child1': 'Andy'}, {'parent1': 'Bob','parent2': 'Mary','child1': 'Mark'}]}"); 
var res = o.SelectToken("theFamilies[0].parent2"); 

UPD 所有令牌,你应该使用SelectTokens

var res = o.SelectTokens("theFamilies[*].parent2"); 
+0

我不认为这实际上返回“parent2”=“Mary”的对象列表 –

+0

@nas yep,只有一个令牌 – ad1Dima

+0

@ n-as已更新我的回答,用于收集令牌 – ad1Dima