Многочисленные / последовательные операторы && в JsonPath не работают - PullRequest
0 голосов
/ 05 января 2019

Попытка использовать два оператора && в запросе jsonpath, но я не могу получить логику, которую я хочу выполнить

   public List<Step> GetBuildSteps()
   {

        var rule1 = "Npm@1";
        var rule2 = "npm build";
        var rule3 = "Npm@0";
        var rule4 = "Build";

        var queryString = string.Format("$..steps[?(@.task == '{0}' &&
  @.displayName =~ /^.*{1}.*$/ ||  @.task == '{2}' && @.displayName =~ 
  /^.*{3}.*$/) ]", rule1, rule2, rule3, rule4);
        return queryJson(queryString);
    }

    private List<Step> queryJson(String queryString)
    {
        var values = json.SelectTokens(queryString).ToList();
        Console.WriteLine(queryString);
        Console.WriteLine(JsonConvert.SerializeObject(values, 
        Formatting.Indented));
        return 
        JsonConvert.DeserializeObject<List<Step>
        (JsonConvert.SerializeObject(values, Formatting.Indented));
    }

Вот мой пример JSON:

{
   "steps":[
      {
         "task":"Npm@1",
         "displayName":"Dev - npm build",
         "inputs":{
            "filename":"tsc",
            "arguments":"-p $(build.sourcesDirectory)\\SelfServeAdminExtn"
         },
         "enabled":"false",
         "continueOnError":"true"
      },
      {
         "task":"Npm@1",
         "displayName":"Install Packages",
         "inputs":{
            "filename":"tfx"
         },
         "enabled":"false",
         "condition":"succeededOrFailed()"
      },
      {
         "task":"Npm@0",
         "displayName":"Preprod - Build",
         "inputs":{
            "filename":"copy",
            "arguments":"$(build.sourcesDirectory)\\ config.ts / y"
         }
      }
   ]
}

Я ожидаю, что оператор? (Условие1 && условие2 || условие3 && условие4) будет работать, но это не так. Это работает только тогда, когда я это делаю? (Условие1 && условие2), но когда я объединяюсь с условием 3 и условием 4, я получаю пустой список.

1 Ответ

0 голосов
/ 08 января 2019

@ dbc, спасибо за вашу помощь, но я решаю эту проблему следующим образом:

 queryString = string.Format("$..steps[?(@.task == '{0}' &&  @.displayName =~
  /^.*{1}.*$/)]", rule1, rule2);

 List<Step> result1 = queryJson(queryString);

 queryString = string.Format("$..steps[?(@.task == '{0}' &&  @.displayName =~
  /^.*{1}.*$/)]", rule3, rule4);

 List<Step> result2 = queryJson(queryString);

 return result1.Union(result2).ToList();
...