Выбор определенного объекта с помощью Json.NET (SelectToken)

Я новичок в Json.NET и пытаюсь использовать функцию SelectToken.

Мой тестовый JSON:

{
  "Root": {
    "aNode": {
      "bNode": {
        "cNode": {
          "id": "myID1"
        }
      },
      "cNode": {
        "id": "myID2"
      },
      "dNode": {
        "cNode": [
          {
            "id": "myID3"
          },
          {
            "id": "myID4"
          }
        ]
      }
    },
    "cNode": {
      "id": "myID5"
    }
  }
}

Теперь я пытаюсь использовать следующий код для получения определенных объектов:

JObject obj = JsonConvert.DeserializeObject<JObject>(jsonTxt);

//Not found
var myID1 = obj.SelectToken("..cNode[?(@.id=='myID1')]");

//Not found
var myID2 = obj.SelectToken("..cNode[?(@.id=='myID2')]");

//Found
var myID3 = obj.SelectToken("..cNode[?(@.id=='myID3')]");

//Found
var myID4 = obj.SelectToken("..cNode[?(@.id=='myID4')]");

//Not found
var myID5 = obj.SelectToken("..cNode[?(@.id=='myID5')]");

Почему я получаю эти (для меня) странные результаты?

Я думаю, что я должен получить в каждом случае объект cNode с определенным идентификатором, а не только myID3 и myID4. Что здесь не так?


person Maas    schedule 18.01.2015    source источник


Ответы (1)


Я не уверен, чего вы действительно хотите достичь, но вы можете использовать Linq для получения cNodes.

var nodes = obj.Descendants()
                .OfType<JProperty>()
                .Where(p => p.Name == "id")
                .Select(p=>p.Parent)
                .ToList();
person EZI    schedule 18.01.2015
comment
Я хочу получить cNode с определенным идентификатором. Допустим, мойID1. (p => p.Name == id && p.Value == myID1) Спасибо за ответ, но я хотел бы знать правильный JPath. - person Maas; 18.01.2015