Что такое правильный формат get () для JsonPath для выбора значения поля в массиве объектов JSON?

Я использую уверенность, чтобы сделать пост-вызов API и получить ответ обратно в теле. Затем мне нужно взять этот ответ и выбрать конкретные значения полей и сохранить их в виде строк, чтобы потом сравнить их с другими строковыми объектами. Я написал jsonpath просто отлично, чтобы получить значения полей верхнего уровня (например, id, статус, тип, страну и т. Д.), Но когда мне нужно попасть внутрь одного из возвращаемых объектов в массиве json, я не могу правильно получить формат для метод get().

Вот пример Json, который возвращается:

{
  "id": "ABC123",
  "status": "NEW",
  "type": "PERSONAL",
  "country": "United States",
  "totalBalances": {},
  "availableBalances": {},
  "fields": [
    {
      "fieldType": "mobilephone",
      "value": "14216904425",
      "fieldId": "personalMobileNumber"
    },
    {
      "fieldType": "email",
      "value": "user12345@work.com",
      "fieldId": "personalEmail"
    },
    {
      "fieldType": "STRING",
      "value": "John Doe",
      "fieldId": "individualName"
    }
  ]
}

Вот путь json, который я пытался отформатировать, чтобы он соответствовал методу get(), но я каждый раз получаю исключение Illegal Argument (java.lang.IllegalArgumentException: недопустимое выражение JSON), я пытаюсь заставить его работать. В основном мне нужно определить правильный объект в массиве и получить правильное значение поля. В этом случае это поле fieldId, и я хочу, чтобы значение "value" поля (Джон Доу), чтобы я мог сохранить его в объект String:

JsonPath pathToAccountName = response.jsonPath();
String accountName = pathToAccountName.get("fields[?(@.fieldId=='individualName')].value")

Я использовал https://jsonpath.curiousconcept.com/ для получения VALID JSON-пути:

$.fields[?(@.fieldId=='individualName')].value

Но я перепробовал все, чтобы превратить его во что-то, что примет метод get(), но безуспешно Обыскать все посты здесь и остальные технические документы тоже не помогли.

2 ответа

Решение

Будьте уверены, использует Gpath Groovy. Таким образом, ваш запрос может выглядеть так:

JsonPath pathToAccountName = response.jsonPath();
String value = jsonPath.getString("fields.find { it.fieldId == 'individualName' }.value");

Здесь вы можете найти несколько примеров (это касается обработки XML, но также применимо к JSON): http://groovy-lang.org/processing-xml.html

Мне нужно знать, как получить этот вывод -

JSON ДОКУМЕНТАЦИЯ - { "status": "E000", "customerId": "VjAxI2VhNzg5ZmJlLWIyNjAtNGZlOS1iZDNkLTdjMmU1MjA2ZmVhZA", "merchantId": "1", "cards": [ { "cardType": "DEBIT", "cardIssuer": "AXIS", "cardBrand": "MASTERCARD", "nickName": "", "expired": "false", "cardMigrationStatus": "OPEN", "tur": null, "category": null }, { "cardType": "CREDIT", "cardIssuer": "ICICI Bank", "cardBrand": "MASTERCARD", "nickName": "", "expired": "false", "cardMigrationStatus": "OPEN", "tur": null, "category": null }, { "cardType": "CREDIT", "cardIssuer": "HDFC Bank", "cardBrand": "MASTERCARD", "nickName": "", "expired": "false", "cardMigrationStatus": "OPEN", "tur": null, "category": null }, { "cardType": "CREDIT", "cardIssuer": "ICICI Bank", "cardBrand": "VISA", "nickName": "", "expired": "false", "cardMigrationStatus": "OPEN", "tur": null, "category": null }, { "cardType": "DEBIT", "cardIssuer": "Punjab National Bank", "cardBrand": "MASTERCARD", "nickName": "", "expired": "false", "cardMigrationStatus": "OPEN", "tur": null, "category": null }, { "cardType": "CREDIT", "cardIssuer": "ICICI Bank", "cardBrand": "MASTERCARD", "nickName": null, "expired": null, "cardMigrationStatus": "DONE", "tur": null, "category": null } ], "status_mssg": null }

Я хочу этот вывод - [ { "cardType": "DEBIT", "cardIssuer": "AXIS", "cardBrand": "MASTERCARD", "nickName": "", "expired": "false", "cardMigrationStatus": "OPEN", "tur": null, "category": null }, { "cardType": "CREDIT", "cardIssuer": "ICICI Bank", "cardBrand": "MASTERCARD", "nickName": "", "expired": "false", "cardMigrationStatus": "OPEN", "tur": null, "category": null }, { "cardType": "CREDIT", "cardIssuer": "HDFC Bank", "cardBrand": "MASTERCARD", "nickName": "", "expired": "false", "cardMigrationStatus": "OPEN", "tur": null, "category": null }, { "cardType": "DEBIT", "cardIssuer": "Punjab National Bank", "cardBrand": "MASTERCARD", "nickName": "", "expired": "false", "cardMigrationStatus": "OPEN", "tur": null, "category": null } ]

Я использую это - jsonPathValidator.getString("$.cards[?(@.cardMigrationStatus == 'OPEN' && @.cardBrand == 'MASTERCARD')]");

но не получая результат.

Другие вопросы по тегам