2016-08-23 6 views
1

У меня есть следующие JSON:'Newtonsoft.Json.Linq.JArray' не содержит определения для

{ 
    "ok": true, 
    "resp": [ 
     { 
      "aaa": 111, 
      "bbb": "xyz", 
      "ccc": [ 
       {...}, 
       { 
        "ddd": "hello", 
        "eee": 666, 
       }, 
       {...} 
      ], 
      "read": false 
     }, 
     {...}, 
     {...} 
    ] 
} 

и это C# код:

dynamic my_obj = JsonConvert.DeserializeObject(JSON); 
var resps = my_obj.resp; 
var x = ((IEnumerable<dynamic>)resps).Cast<dynamic>() 
          .Where(p => p.ccc.eee == 666).Count(); 

и ниже ошибки:

'Newtonsoft.Json.Linq.JArray' does not contain a definition for 'eee'. 

Я знаю, что я мог бы перебирать все элементы в элементах 'resps' и count, где элемент ccc.eee равен 666, но возможно ли это сделать в одной строке wi th linq?

+4

Если он не будет 'ссс [1] .eee '? –

+0

Это ответ, если вы хотите сделать его одним из @UlugbekUmirov – Jonesopolis

+0

думаю, что OP ошибочно запрашивает в памяти obejct с MongoDB – Rahul

ответ

5

С ccc массив, вам нужно перебрать его.

Граф количество EEE = 666:

int x = ((IEnumerable<dynamic>)resps).Sum(
      p => ((IEnumerable<dynamic>)p.ccc).Count(o => o.eee == 666)); 

Подсчет количества объектов в соотв, имеющий по меньшей мере один еее = 666:

int x = ((IEnumerable<dynamic>)resps).Count(
      p => ((IEnumerable<dynamic>)p.ccc).Any(o => o.eee == 666)); 
+0

Почти там .. В вашем ответе указано количество «eee = 666». Array 'ccc' может иметь более одного элемента, где eee = 666 (и я хочу считать его только один раз). Я ищу несколько объектов в словах, где «eee = 666»? – KD82

+0

@ KD82 Я обновил ответ –

+1

Спасибо @Ulugbek. Работает как шарм, когда вы кладете ')' до '. Любой' – KD82

Смежные вопросы