Рассмотрим следующий набор данных:
[
{
"_id": 1234,
"bagnumber": "A",
"bagtype": "coin"
},
{
"_id": 2345,
"bagnumber": "B",
"bagtype": "cash"
},
{
"_id": 3456,
"bagnumber": "C",
"bagtype": "coin"
},
{
"_id": 5678,
"bagnumber": "D",
"bagtype": "cash"
}
]
Мне нужно извлечь и распечатать номера сумок, которые имеют исключительно тип сумки «наличные». Таким образом, желаемый результат должен быть:
Bag numbers are: B, D
Сначала я попытался извлечь номера сумок, используя список:
List<String> bagNumbers = response.jsonPath().getList("bagnumber");
Впоследствии я попытался получить типы сумок, используя тот же список, и попытался сравнить два списка. Однако мои попытки не увенчались успехом, что, возможно, указывает на слишком сложный подход.
Может ли кто-нибудь любезно предложить более эффективное решение? Возможно, будет полезно использовать класс Matchers или любой другой подходящий подход.




Я предлагаю Gson или Jackson для процесса Json.
Если входные данные являются строкой, преобразуйте их в JsonArray, используя:
JsonArray jsonData = new Gson().fromJson(jsonString, JsonArray.class);
Создайте список, содержащий результат:
List<String> listBadCashNumber =new ArrayList<>();
Начните перебирать массив:
for(int i = 0;i<jsonData.size();i++){
JsonObject bag = jsonData.get(i).getAsJsonObject();// Because each element off array is a object
if (bag.get("bagtype").getAsString().equals("cash")){ // Compare the field 'bagtype', you should handle the null if needed
listBadCashNumber.add(bag.get("bagnumber").getAsString()); // Add to result list
}
}
System.out.println("Bag numbers are: "+listBadCashNumber);
И результат:
Bag numbers are: [B, D]
@user2024 user2024 Что такое «метод get» в этом контексте? допустимым вводом .fromJson является Reader или String. Вам следует преобразовать ввод в строку.
в RestAssured я использовал метод GET из URL-адреса, который вернул ответ в формате Json Array, т.е. «Response = [ {}, {}, {}]» (например, набор данных, который я дал выше) - поэтому, получая ответ, я должен получить их как [B,D]
«Response = [ {}, {}, {} ]» не является форматом Json, я думаю, вы упоминаете Response = «[ {}, {}, {} ]», поэтому вы должны преобразовать его в строку с помощью его метода , например .toString() или .getBody() или .getResponseBody(), .getBody().entity(), ..... затем вы преобразуете его с помощью Gson.
Я действительно сделал эти шаги вчера и смог добиться успеха в числах сумок. 1. Преобразовал ответ в строку, используя String stringresponse = response.asString(); 2. Затем преобразовали их в JsonArray, используя JsonArray jsonData = new Gson().fromJson(stringresponse, JsonArray.class); тогда ваши предложения - смогу получить :) Спасибо!
@user2024 user2024 приятно это слышать.
можешь ли ты сделать это решенным
Вы можете попробовать JSON-библиотеку Josson, и ваш запрос может быть выполнен с помощью коротких операторов и функций.
https://github.com/octomix/josson
Josson josson = Josson.fromJsonString(
"[" +
" {" +
" \"_id\": 1234," +
" \"bagnumber\": \"A\"," +
" \"bagtype\": \"coin\"" +
" }," +
" {" +
" \"_id\": 2345," +
" \"bagnumber\": \"B\"," +
" \"bagtype\": \"cash\"" +
" }," +
" {" +
" \"_id\": 3456," +
" \"bagnumber\": \"C\"," +
" \"bagtype\": \"coin\"" +
" }," +
" {" +
" \"_id\": 5678," +
" \"bagnumber\": \"D\"," +
" \"bagtype\": \"cash\"" +
" }" +
"]");
String output = josson.getString("[bagtype='cash']*.bagnumber.join(', ').prepend('Bag numbers are: ')");
System.out.println(output); // "Bag numbers are: B, D"
ввод представляет собой метод get. Вывод, который я получаю, - это массив json, например "[ {}, {}, {}]", как преобразовать их в объект JsonArray?, и когда я пытаюсь, ".fromJson" - он выдает ошибку при использовании "tojson"