Как использовать строковое значение во время выполнения в запросе SelectToken JSONPath

У меня есть следующий код, и я использую популярную библиотеку Newtonsoft на С#.

string json = {
  "students": [
    {
      "name": "student 1",
      "grades": [
        {
          "subject1": "A",
          "subject2": "B"
        }
      ]
    }
  ]
}

JObject rootJObject = JObject.Parse(json);

Я хочу выбрать конкретный студенческий объект. Если я запрашиваю с помощью JSONPath литеральную строку, как показано ниже, я получаю фактический объект

rootJObject.SelectToken("$.students[?(@.name=='student 1')]");

Теперь, если я хочу передать строку запроса во время выполнения, как показано ниже

string studentName = "student 1"; rootJObject.SelectToken($"$.students[?(@.name=={studentName})]");

Выдает исключение вроде "Unexpected character while parsing path query: s"

Является ли ограничением то, что мы можем использовать литеральную строку только с одинарными кавычками в запросе JSONPath, а не строковое значение во время выполнения?


person Rajaraman    schedule 02.03.2018    source источник
comment
Вам нужны одинарные кавычки вокруг {studentName}, это должно быть '{studentName}'   -  person dbc    schedule 02.03.2018
comment
Спасибо @dbc, это сработало.   -  person Rajaraman    schedule 02.03.2018
comment
@dbc Вы должны отправить ответ, это будет полезно для других, которые зададут этот вопрос, и Раджараман, пожалуйста, примите этот ответ.   -  person FaizanHussainRabbani    schedule 02.03.2018


Ответы (1)


Как показано в разделе Запрос JSON с помощью JSONPath, необходимо заключать в одинарные кавычки вокруг строковых литералов в выражениях фильтра. Итак, {studentName} должно быть '{studentName}':

var result = rootJObject.SelectToken($"$.students[?(@.name=='{studentName}')]");

Или, используя старый string.Format() стиль:

var result = rootJObject.SelectToken(string.Format("$.students[?(@.name=='{0}')]", studentName));

Или с помощью простых конкатенаций строк:

var result2 = rootJObject.SelectToken("$.students[?(@.name=='" + studentName + "')]");

Обратите внимание, что «строковый литерал» не означает «строку, созданную полностью во время компиляции», это означает «строковое значение, включенное в JSONPath выражение". Любая строка C#, созданная любым методом, может быть передана. В каждом операторе выше строка создается во время выполнения, заключая значение переменной studentName в одинарные кавычки и внедряя его в полное выражение JSONPath. В первом операторе используется интерполяция строк. в то время как второй использует явный вызов функции, но оба делают одно и то же.

Пример скрипта .Net.

person dbc    schedule 02.03.2018