Как проверить, существует ли значение в массиве JSON для определенного ключа?

Мой файл массива JSON:

[
    {
      "setName": "set-1",
      "testTagName": "Test1",
      "methodName": "addCustomer"
    },
    {
        "setName": "set-1",
        "testTagName": "Test2",
        "methodName": "addAccount"
    },
    {
        "setName": "set-2",
        "testTagName": "Test3",
        "methodName": "addRole"
    }
  ]

Я использую Яву. У меня есть указанный выше массив JSON в объекте Gson. Как выполнить итерацию по этому массиву Gson, чтобы проверить, существует ли конкретное имя метода (например, addRole) в массиве для ключа methodName в любом из объектов массива JSON? В результате я ожидаю true/false.

Я проверил документ GSON - (https://github.com/google/gson/blob/master/gson/src/main/java/com/google/gson/JsonObject.java#L141)

Метод has, кажется, проверяет ключ. Я ищу метод, который может перебирать объекты массива и проверять, существует ли определенное значение для определенного ключа.

Как я могу этого добиться?


person AutoTester999    schedule 15.07.2021    source источник
comment
какой тип контейнера содержит эти объекты JSON? обычно они хранятся в массиве, и вы просто перебираете массив и используете те методы, которые вы использовали для каждого объекта, например jsonArray[index].get(methodName).equals(addRole)   -  person RAZ_Muh_Taz    schedule 16.07.2021
comment
Он хранится в файле .json. В коде он представлен в виде объекта GSON.   -  person AutoTester999    schedule 16.07.2021
comment
Мы понимаем, что вам нужен пример gson?   -  person g00se    schedule 16.07.2021


Ответы (2)


Сначала вам нужно десериализовать код JSON в JsonArray следующим образом:

JsonArray jsonArr = gson.fromJson(jsonString, JsonArray.class);

После этого вы можете создать этот метод:

public boolean hasValue(JsonArray json, String key, String value) {
    for(int i = 0; i < json.size(); i++) {  // iterate through the JsonArray
        // first I get the 'i' JsonElement as a JsonObject, then I get the key as a string and I compare it with the value
        if(json.get(i).getAsJsonObject().get(key).getAsString().equals(value)) return true;
    }
    return false;
}

Теперь вы можете вызвать метод:

hasValue(jsonArr, "methodName", "addRole");
person Crih.exe    schedule 15.07.2021
comment
Вы можете сделать это с помощью регулярного выражения без десериализации KEY\s*:\s*VALUE - person George Vassilev; 16.07.2021
comment
@GeorgeVassilev Вы понимаете, насколько плох предложенный вами подход? - person fluffy; 16.07.2021

Вы можете получить JSON в JsonArray, а затем перебирать элементы, проверяя желаемое значение.

Один из подходов предложен @Crih.exe выше. Если вы хотите использовать потоки, вы можете преобразовать JsonArray в поток и использовать anyMatch для возврата логического значения.

...
// Stream JsonArray
Stream<JsonElement> stream = StreamSupport.stream(array.spliterator(), true);

// Check for any matching element
boolean result = stream.anyMatch(e -> e.getAsJsonObject()
                   .get("methodName").getAsString().equals("addRole"));

System.out.println(result);
...
person Vini    schedule 16.07.2021