Как десериализовать поле, которое передается либо как один объект, либо как список объектов с помощью GSON? - PullRequest
0 голосов
/ 22 сентября 2018

Я успешно использовал GSON для преобразования JSON в один объект и для преобразования JSON в список объектов.Моя проблема в том, что есть 2 источника, которые передают мне данные.Один отправляет только один объект, а другой отправляет список объектов.

Один объект из 1-го источника:

{
    id : '1',
    title: 'sample title',
    ....
}

Список объектов из 2-го источника:

[
    {
        id : '1',
        title: 'sample title',
        ....
    },
    {
        id : '2',
        title: 'sample title',
        ....
    },
    ...
]

Класс , используемый для десериализации:

 public class Post {

      private String id;
      private String title;

      /* getters & setters */
 }

Ниже работает для моего 1-го случая:

Post postData = gson.fromJson(jsonObj.toString(), Post.class);

И это работает для моего второго дела:

Post[] postDatas = gson.fromJson(jsonObj.toString(), Post[].class);

Есть ли способ управления обоими делами?Или я должен посмотреть на строку и добавить [], когда она недоступна Спасибо

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Как насчет создания пользовательского десериализатора, который проверяет, является ли json массивом, и если нет, создает массив, содержащий единственный объект, например:

public class PostArrayOrSingleDeserializer implements JsonDeserializer<Post[]> {

    private static final Gson gson = new Gson();

    public Post[] deserialize(JsonElement json, Type typeOfT, 
                JsonDeserializationContext ctx) {
        try {
            return gson.fromJson(json.getAsJsonArray(), typeOfT);
        } catch (Exception e) {
            return new Post[] { gson.fromJson(json, Post.class) };
        }
    }
}

, и добавляет его в свой Gson:

Post[] postDatas = new GsonBuilder().setPrettyPrinting()
    .registerTypeAdapter(Post[].class, new PostArrayOrSingleDeserializer())
    .create()
    .fromJson(jsonObj.toString(), Post[].class);

Таким образом, в результате вы всегда должны иметь массив Post с одним или несколькими элементами.

0 голосов
/ 22 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...