2015-07-19 4 views
1

уточняющий мой вопрос, я хотел бы использовать JToken.SelectTokens Method (String) от Namespace: Newtonsoft.Json.Linq. Как я могу использовать метод SelectTokens("") для получения количества детей для каждого узла "174637" (unit_id) и "174638" (unit_id)?. Для первого узла я должен получить 1 и для второго 2. Я пробовал так:C# json count node's дети

foreach (var test in unit_ids) { //takes every unit_id, one by one 
    var children_of_unit_id = test.SelectTokens("*.[*]").count(); 
} 

Но это не дает мне ничего.

"174637": { 
    "1": { 
    "value_symbol": "3", 
    "exam_session_number": 1, 
    "exam_id": 207983, 
    "value_description": { 
     "en": "satisfactory", 
    } 
    } 
} 
"174638": { 
    "1": { 
    "value_symbol": "3", 
    "exam_session_number": 1, 
    "exam_id": 207984, 
    "value_description": { 
     "en": "satisfactory", 
    } 
    } 
    "2": { 
    "value_symbol": "3", 
    "exam_session_number": 2, 
    "exam_id": 207985, 
    "value_description": { 
     "en": "satisfactory", 
    } 
    } 
} 

EDITED

Это оригинальный Json:

{ 
    "grades": { 
    "course_units_grades": { 
     "173565": { 
     "1": { 
      "value_symbol": "3,5", 
      "exam_session_number": 1, 
      "exam_id": 208798, 
      "value_description": { 
      "en": "satisfactory plus", 
      "pl": "dst+" 
      } 
     } 
     }, 
     "173566": { 
     "1": { 
      "value_symbol": "2", 
      "exam_session_number": 1, 
      "exam_id": 208797, 
      "value_description": { 
      "en": "unsatisfactory", 
      } 
     }, 
     "2": { 
      "value_symbol": "3", 
      "exam_session_number": 2, 
      "exam_id": 208797, 
      "value_description": { 
      "en": "satisfactory", 
      } 
     } 
     } 
    }, 
    "course_grades": {} 
    } 
} 

Так это выглядит следующим образом:

foreach (var t in json_grade)//take every "grades" element, one by one 
{ 
    var test = t.SelectTokens("['grades'].['course_units_grades']"); 

    foreach (var unit_ids in test) 
    { 
     foreach (var test in unit_ids) { //takes every unit_id, one by one 
      var children_of_unit_id = test.SelectTokens("*.[*]").count(); 
     } 
    } 
} 
+0

'json' не является действительным. –

+0

Я думаю, у вас нет выбора, кроме как сканировать дерево json. Я уверен, что есть много примеров JFS.NET BFS/DFS. –

+0

Я отредактировал свое сообщение, чтобы показать исходную структуру json и как выглядит 'foreach'. –

ответ

1

Вы можете попробовать один из этих 2-мя способами:

foreach (var test in unit_ids) 
{ 
    var approach1 = test.Children().Children().Count(); 
    var approach2 = test.First.SelectTokens("*").Count(); 
} 

Dotnetfiddle Demo

0

Попробуйте это:

var token = JToken.Parse(j)["unit_id"][0].ToList().Count; 

Пример JSON:

{ 
    "174637": [ 
    { 
     "1": { 
     "value_symbol": "3", 
     "exam_session_number": "1", 
     "exam_id": "207983", 
     "value_description": { 
      "en": "value_description" 
     } 
     } 
    } 
    ], 
    "174638": [ 
    { 
     "1": { 
     "value_symbol": "3", 
     "exam_session_number": "1", 
     "exam_id": "207983", 
     "value_description": { 
      "en": "value_description" 
     } 
     }, 
     "2": { 
     "value_symbol": "3", 
     "exam_session_number": "1", 
     "exam_id": "207983", 
     "value_description": { 
      "en": "value_description" 
     } 
     } 
    } 
    ] 
} 
+0

'' '' '' 'json', который вы разбираете. –