使用Json.NET选择特定对象(SelectToken)

时间:2015-01-18 20:00:16

标签: c# json.net jsonpath

我是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')]");

为什么我会得到这些(对我来说)奇怪的结果?

我认为我应该在每种情况下都得到具有特定ID的cNode对象,而不仅仅是myID3myID4。这有什么不对?

1 个答案:

答案 0 :(得分:2)

我不确定你真正想要实现的目标,但你可以使用Linq来获取cNodes

var nodes = obj.Descendants()
                .OfType<JProperty>()
                .Where(p => p.Name == "id")
                .Select(p=>p.Parent)
                .ToList();