【问题标题】:Selecting specific object with Json.NET (SelectToken)使用 Json.NET (SelectToken) 选择特定对象
【发布时间】:2015-01-18 20:00:16
【问题描述】:

我是 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。这里有什么问题?

【问题讨论】:

    标签: c# json.net jsonpath


    【解决方案1】:

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

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

    【讨论】:

    • 我想获取具有特定“id”的 cNode。让我们说“myID1”。 (p => p.Name == "id" && p.Value == "myID1") 感谢您的回答,但我想知道正确的 JPath。
    猜你喜欢
    • 1970-01-01
    • 2015-12-22
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多