Java: извлечение индекса src из мультимассива

Итак, я столкнулся с этой странной проблемой: я использую Woocommerce Rest API, и мне нужно получить src из массива «images».

Я уже пытался сохранить массив изображений в другом массиве, но тогда я понятия не имею, как получить «src» из массива:

try {
    ConnectionRequest r = new ConnectionRequest();
    r.setPost(false);
    r.setUrl("https://" + tokens.getShop_name_token() + ".ch/wp-json/wc/v3/products?consumer_key = " + tokens.getConsumer_key_token() + "&consumer_secret = " + tokens.getSecret_key_token());
    NetworkManager.getInstance().addToQueueAndWait(r);
    Map<String, Object> result = new JSONParser().parseJSON(new InputStreamReader(new ByteArrayInputStream(r.getResponseData()), "UTF-8"));

    //JSON Filter     
    ArrayList<Map<String, String>> myList = (ArrayList<Map<String, String>>) result.get("root");
    for (int i = 0; i < myList.size(); i++) {
        Map<String, String> dtls = myList.get(i);
        productsArr.add(dtls.get("name"));
        productStock.add(dtls.get("stock_status"));
        productDateCreated.add(dtls.get("date_created"));
        //TODO: Filter out image-soure
        productImages.add(dtls.get("images"));
    }
    System.out.println(productImages);

Output: [[], [], [], [{id=16.0, date_created=2018-11-08T15:21:14, date_created_gmt=2018-11-08T15:21:14, date_modified=2018-11-08T15:21:14, date_modified_gmt=2018-11-08T15:21:14, src=https://website.com/wp-content/uploads/2018/11/1.jpg, name=Vneck Tshirt, alt=}], [{id=15.0, date_created=2018-11-08T15:21:14, date_created_gmt=2018-11-08T15:21:14, date_modified=2018-11-08T15:21:14, date_modified_gmt=2018-11-08T15:21:14, src=https://website.com/wp-content/uploads/2018/11/21.jpg, name=Tshirt, alt=}]]

Я зашел так далеко. Теперь мой вопрос: как я могу отфильтровать индекс, чтобы получить «src» изображения?

Откуда берется productImages? Каков его тип? Как выглядит Json, который вы получаете от API? Если ваш объект Json представляет собой что-то иное, кроме одного уровня строковых значений, вам нужно разобрать его на что-то другое, кроме Map<String, String>.

Billy Brown 18.01.2019 12:21

productImages — это переменная класса: ArrayList<String> productImages = new ArrayList<>();.

Ri1a 18.01.2019 12:31

С вашей текущей настройкой вы можете еще раз проанализировать Json в productImages и получить свойство src. Однако я бы рекомендовал работать непосредственно с исходным объектом Json, а не преобразовывать его в Map<String, String>, а вместо этого извлекать только необходимые поля из объекта Json.

Billy Brown 18.01.2019 12:36

Не могли бы вы дать решение о том, как напрямую работать с исходным JSON?

Ri1a 18.01.2019 12:41

Какой пакет Json вы используете? Это org.json.simple?

Billy Brown 18.01.2019 12:47
com.codename1.io.JSONParser это для мобильного приложения
Ri1a 18.01.2019 15:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Поскольку вы используете синтаксический анализатор JSON com.codename1.io.JSONParser с минимальным набором функций, который анализирует JSON в Map<String, Object> и ничего больше, вам нужно преобразовать Object, который вы получаете, выбрав значение, в ожидаемый тип и повторить оттуда.

Если объект JSON верхнего уровня представляет собой массив, то создается специальный элемент "root", что вы и получаете здесь. Это означает, что структура вашего JSON анализируется следующим образом:

{
    "root": [
        {
            "name": <str>,
            "stock_status": <???>,
            "date_created": <str>,
            "images": 
                {
                    "id": <num>,
                    "date_*": <str>,
                    "src": <str>,
                    "name": <str>,
                    "alt": <str>
                }
            ]
        }
    ]
}

Таким образом, чтобы извлечь src образа, вы извлекли массив "root" и выполнили итерацию по нему. Однако вместо преобразования результатов в Map<String, String> вы хотите сохранить их как Map<String, Object>:

for (const Map<String, Object> element : (List<Map<String, Object>>) result.get("root")) {
    // The "element" object has an "images" value that is a list of objects
    for (const Map<String, Object> image : (List<Map<String, Object>>) element.get("images")) {
        // Save the "src" field of each image
        productImages.add((String) image.get("src"));
    }
}

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