Как создать выражение фильтра JSONPath для поиска с использованием ключевого слова contains

У меня есть требование, когда я пытаюсь выбрать объекты внутри строки JSON путем фильтрации по присутствию, содержащему значения свойств объектов внутри массива JSON. Вот пример моего массива JSON:

var Json_String = [{
  'Identifier': 1,
  'CustomerId': 1,
  'AccountType': 'Saving Account',
  'AccountNumber': 'ACC-345678',
  'TransactionDate': '22-09-2020',
  'Narration': 'NXT TXN: RENT FDR SEP2020'
},
{
  'Identifier': 2,
  'CustomerId': 1,
  'AccountType': 'Current Account',
  'AccountNumber': 'ACC-56432',
  'TransactionDate': '23-09-2020',
  'Narration': 'NXT TXN: Depreciation expense'
}]

Я хочу найти объект JSON, используя ключевое слово Contains, например:

Я уже пробовал использовать следующий запрос:

var res = Json_String.Where(it => it.Value["AccountType"].ToString().Contains("Saving")).ToList();

Вышеупомянутый запрос дает мне точный результат, который я хочу. Но в моем случае ключ фильтра, критерии фильтра и значение фильтра должны быть динамическими, а это означает, что я не знаю, какое значение и условие фильтра должны поступать во время выполнения фильтрации. например У меня ниже критерии фильтра формата в формате массива JSON, которые определяются пользователем.

[{
    "FieldId": "14",
    "Operator": "Contains",
    "ConditionalOperator": null,
    "Sequence": 1,
    "Value": "Saving",
    "OperatorName": "Contains",
    "FieldName": "AccountType"
}, {
    "FieldId": "15",
    "Operator": "GreaterThan",
    "ConditionalOperator": "AND",
    "Sequence": 2,
    "Value": "01/09/2020",
    "OperatorName": "GreaterThan",
    "FieldName": "TransactionDate"
}]

Итак, я хочу создать динамический запрос JsonPath с более чем одним условием, используя указанный выше критерий фильтра формата JSON-массив для поиска записей.

Мне нужен ответ на С #. На данный момент. Я попытался использовать NewtonSoft.Json SelectToken для выбора токена с помощью запроса JSONPath.

var res = Json_String.SelectTokens("$.[?(@.AccountType=='Saving Account')]").ToList();

Вышеупомянутый запрос JSONPath также предоставляет мне данные путем фильтрации из моего фактического массива строк JSON. Но когда я пытался фильтровать данные с использованием ключевых слов, это не дало мне результата.

var res = Json_String.SelectTokens("$.[?(@.AccountType.Contains('Saving'))]").ToList();

Мне нужен синтаксис оператора ключевого слова Contains. Любые предложения были бы полезны.


person user4155    schedule 07.12.2020    source источник
comment
Насколько мне известно, Json.Net не поддерживает оператор Contains в выражении JsonPath. Однако, начиная с версии 11.0.1, он поддерживает регулярные выражения в JsonPath, поэтому вы можете использовать этот подход для выполнения своего запроса. См. JSON.NET - найти JObject по регулярному выражению значения в сложном объекте?   -  person Brian Rogers    schedule 08.12.2020


Ответы (1)


Вы можете решить эту проблему, используя приведенную ниже логику кода. Сначала преобразуйте объект JSON в строку, а затем преобразуйте его с помощью класса JSONConvert. После преобразования вы можете применить всю логику Linq к набору результатов.

string Json_String = "[{
'Identifier': 1,
  'CustomerId': 1,
  'AccountType': 'Saving Account',
  'AccountNumber': 'ACC-345678',
  'TransactionDate': '22-09-2020',
  'Narration': 'NXT TXN: RENT FDR SEP2020'
},
{
  'Identifier': 2,
  'CustomerId': 1,
  'AccountType': 'Current Account',
  'AccountNumber': 'ACC-56432',
  'TransactionDate': '23-09-2020',
  'Narration': 'NXT TXN: Depreciation expense'
}]";

var result = JsonConvert.DeserializeObject(Json_String);
var res = (result as Newtonsoft.Json.Linq.JArray).Where(x => x["AccountType"].ToString().Contains("Saving")).ToList();
person Rajeev Kumar    schedule 07.12.2020