使用SelectTokens和一个包含正则表达式查询JArray

时间:2019-02-25 21:56:19

标签: c# json.net

我正在尝试编写一种方法,该方法将采用以下JSON结构,并为所有其中路径包含字符串的所有路径返回路径属性。因此,在这种情况下,如果我调用GetPath(json,“ User1”),我想获取[“ User1 \ path1”,“ User1 \ path2”]

[  
   {  
      "id":90BCV,
      "name":"Path 1",
      "path":"User1\\path 1"
   },
   {  
      "id":90BC,
      "name":"Path 2",
      "path":"User1\\path 2"
   },
   {  
      "id":91AB,
      "name":"Path 3",
      "path":"User2\\path 3"
   }
]

    public static List<string> GetPath(string json, string key)
       {
           JArray reader = JArray.Parse(json);

           List<JToken> paths = reader.SelectTokens("$.[?(@.path=~@'" + key + "')]").ToList();
           List<string> returnList = new List<string>();

           foreach (JToken path in paths)
           {
                returnList.Add((string)path["path"]);
           }

                return returnList;
}

我尝试了多种不同的正则表达式方法,但似乎无法正确执行此查询。大多数时候,我最终会得到一个空列表或无效的正则表达式错误。

3 个答案:

答案 0 :(得分:1)

可行

    static string json = @"
[  
   {  
      ""id"":""90BCV"",
      ""name"":""Path 1"",
      ""path"":""User1\\path 1""
   },
   {  
      ""id"":""90BC"",
      ""name"":""Path 2"",
      ""path"":""User1path 2""
   },
   {  
      ""id"":""91AB"",
      ""name"":""Path 3"",
      ""path"":""User2\\path 3""
   }
]
";
    static void Main(string[] args)
    {
      string key = "User2\\\\path 3";

      JArray reader = JArray.Parse(json);

      List<JToken> paths = reader.SelectTokens("$.[?(@.path=='" + key + "')]").ToList();

    }

那里几乎没有东西 -==,而不仅仅是=,因为JPath使用代码内编译器,所以您遵循C#约定。 -出于同样的原因,您需要\\代表\

答案 1 :(得分:1)

我不知道您为什么要采用这种方法。我宁愿使用.ToString()然后在.foreach循环中使用.Contains。

Key

答案 2 :(得分:1)

顺便说一句,如果您真的想做正则表达式的话,那就对了:

List<JToken> paths = reader.SelectTokens("$.[?(@.path=~/^" + key + "$/)]").ToList();