Есть ли способ отфильтровать массив и собрать несколько узлов JSON в список Java?

У меня есть этот список ответов JSON API:

[
    {
        "id": "demoType",
        "label": "Demo Type",
        "option": [
            "MAJOR"
        ]
    },
    {
        "id": "test",
        "label": "test",
        "option": [
            {
                "name": "testOne",
                "id": "1111",
                "demolId": "demoid-1"
            },
            {
                "name": "testTwo",
                "id": "2222",
                "demoId": "demoid-3"
            },
            {
                "name": "testThree",
                "id": "3333",
                "demolId": "demo-2"
            }
        ]
    },
    {
        "id": "sampleType",
        "label": "sample",
        "option": [
            {
                "name": "sampleA",
                "id": "4444"
            }
        ]
    },
    {
        "id": "runType",
        "label": "run one",
        "option": [
            {
                "name": "runA",
                "id": "eaf7d6a5-2038-45a0-9f06-6410694e5354",
                "demoId": "demolid-1"
            }
        ]
    },
    {
        "id": "city",
        "label": "City",
        "option": [
            "york",
            "tampa"
        ]
    }

]

У меня есть соответствующий ответDTO:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class DemoResponse {
  public String id;
  public String label;
  public ArrayList<Object> option;
}

Ответ API имеет свойство под названием option, которое несколько раз появляется во вложенном списке. Чего я хочу добиться, так это собрать значения всех свойств параметров в список.

Я пробовал так:

DemoResponse[] response = (BaseClient.getResponse().as(DemoResponse[].class));
List<String> optionlList  =
            response.stream().map(newList -> newdList.toString()).collect(Collectors.toList());

stream не удалось скомпилировать. Я убежден, что то, что я делаю, явно неправильно, но я не уверен, как добиться того, чего я хочу, а именно получить все значения полей параметров в ответе API и собрать их в список.

Каким вы хотите, чтобы ваш optionList был?

HariHaravelan 20.02.2023 16:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Над массивом нет .stream(), вам нужно использовать Arrays.stream

DemoResponse[] response = (BaseClient.getResponse().as(DemoResponse[].class));
List<String> optionlList  =
            Arrays.stream(response).map(res -> res.option.toString()).collect(Collectors.toList());

Вы можете сделать, как показано ниже, пропустить через массив response и опцию flatMap и собрать в один список.

        DemoResponse[] response = (BaseClient.getResponse().as(DemoResponse[].class));

        List<String> optionList = Arrays.stream(response)
                .flatMap(demoResponse -> demoResponse.getOption().stream())
                .map(Object::toString)
                .collect(Collectors.toList());

Ваш optionList будет

[MAJOR, {name=testOne, id=1111, demolId=demoid-1}, {name=testTwo, id=2222, demoId=demoid-3}, {name=testThree, id=3333, demolId=demo-2}, {name=sampleA, id=4444}, {name=runA, id=eaf7d6a5-2038-45a0-9f06-6410694e5354, demoId=demolid-1}, york, tampa]

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