Извлечь массив из объекта Json - PullRequest
0 голосов
/ 01 мая 2019

Я хочу извлечь массив из Json Object, используя библиотеку GSON.

Я уже пытался создать класс и позволить библиотеке Gson делать всю работу, но в данном конкретном случае это не работает.

Класс для извлеченных данных

public class Images {
        private Image[] images;

        public class Image {
            private String url;

            public Image(String url) {
                this.url = url;
            }

            public String getUrl() {
                return url;
            }
        }

        public Images(Image[] images) {
            this.images = images;
        }

        public Image[] getImages() {
            return images;
        }
    }

Пример данных

...
,
"images": [
   {
     "url": "https://a.allegroimg.com/original/030516/a867b9dd4021b15678fc03a3981b"
    },
    {
       "url": "https://a.allegroimg.com/original/03da09/19740f7147ad929609cc2bcc499e"
    },
    {
        "url": "https://a.allegroimg.com/original/03198b/c024c7e448cab876bb49ad055567"
    },
    {
        "url": "https://a.allegroimg.com/original/039fee/64bae4c64dac89e5b5b4d001c2ca"
     }
],
...

Я получаю сообщение об ошибке: "com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY в строке 1 столбца 283 пути $ .items.promoted [0] .images"
Я прошу помощи в извлечении данных из объекта JSON.

Редактировать

Мне просто нужно было удалить класс 'Images' и сохранить 'urls' из Json в Image []

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Вы можете использовать библиотеку DSM .Используя его, вы можете извлечь часть JSON при чтении данных JSON.

Прежде всего вы должны определить свое отображение в формате yaml.

Определение отображения:

 result:
   type: array  # expect result as array
   path: /images
   fields:
     url:

Используйте DSM для чтения данных.

DSM dsm=new DSMBuilder(new File("path/to/config.yaml")).create();
Object object=dsm.toObject(new File("path/to/data.json");
System.out.println(object);

Вот вывод:

[{url=https://a.allegroimg.com/original/030516/a867b9dd4021b15678fc03a3981b}, {url=https://a.allegroimg.com/original/03da09/19740f7147ad929609cc2bcc499e}, {url=https://a.allegroimg.com/original/03198b/c024c7e448cab876bb49ad055567}, {url=https://a.allegroimg.com/original/039fee/64bae4c64dac89e5b5b4d001c2ca}]

, если вы хотите получить все поля url в виде списка, который выможет зарядить ваше определение сопоставления следующим образом.

result:
   type: array
   path: /images/url

Вывод этого сопоставления:

[https://a.allegroimg.com/original/030516/a867b9dd4021b15678fc03a3981b, https://a.allegroimg.com/original/03da09/19740f7147ad929609cc2bcc499e, https://a.allegroimg.com/original/03198b/c024c7e448cab876bb49ad055567, https://a.allegroimg.com/original/039fee/64bae4c64dac89e5b5b4d001c2ca]
0 голосов
/ 01 мая 2019

Ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY в строке 1 столбца 283 пути $ .items.promoted [0] .images

Проблема связана с классом оболочки Images. Из-за ошибки, я думаю, что ваш объект выглядит примерно так:

class Promoted {
  private Images images;
  ..
}

class Images {
  private Image[] images;
}

В вашей текущей форме json, который вы сможете проанализировать:

...
,
"images": {
  "images": [
    {
      "url": "https://a.allegroimg.com/original/030516/a867b9dd4021b15678fc03a3981b"
    },
    {
      "url": "https://a.allegroimg.com/original/03da09/19740f7147ad929609cc2bcc499e"
    },
    {
      "url": "https://a.allegroimg.com/original/03198b/c024c7e448cab876bb49ad055567"
    },
    {
      "url": "https://a.allegroimg.com/original/039fee/64bae4c64dac89e5b5b4d001c2ca"
    }
  ]
}
...

Вместо этого вы можете непосредственно встроить массив Image[] в родительский объект (без класса-оболочки):

class Promoted {
  private Image[] images;
  ..
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...