Как читать объекты Dynami c, к которым добавлено число в GSON? - PullRequest
0 голосов
/ 01 апреля 2020

Результат, полученный из внешнего API как ..

  • BIBREF - это динамические c, мы не знаем, как будет получен
  • Индекс добавляется к имя "BIBREF + число"
"bib_entries": {
   "BIBREF0": {
      "ref_id": <str>,
      "title": <str>,
   },
   "BIBREF1": {
      "ref_id": <str>,
      "title": <str>,
   },
   ...
   ...
   "BIBREF25": {}
},

Определяется pojo как ..

public class BibEntries {
   private BibRef bibRef;
   # ...getters/setters

   public class BibRef {
      private String ref_id;
      private String title;
      # ...getters/setters
   }
}

Определяется класс как:

JsonObject bibEntriesObject = jsonObject.get("bib_entries").getAsJsonObject();
BibEntries bibEntries = new Gson().fromJson(bibEntriesObject, BibEntries.class);

Обучение GSON и использование GenericTypes показалось непонятным. Как я могу обновить приведенный выше код для чтения объектов Dynami c (с использованием gson 2.8.6)?

1 Ответ

0 голосов
/ 05 апреля 2020

С помощью моего коллеги, вот решение

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.List;

public class Test {
  private static final Gson gson = new 
  GsonBuilder().serializeNulls().setPrettyPrinting().create();

  public static void main(String[] args) {
    // Original Json Input
    String jsonRequest = "{ \"bib_entries\": { \"BIBREF0\": { \"ref_id\": \"One\", \"title\": \"two\"},"
        + "\"BIBREF1\": { \"ref_id\": \"three\", \"title\": \"four\"} } }";

    //Convert string to JsonObject
    JsonObject convertedObject = new Gson().fromJson(jsonRequest, JsonObject.class);
    JsonObject object = convertedObject.get("bib_entries").getAsJsonObject();

    //Init Class
    BibEntries bibEntries = new BibEntries();
    List<BibEntries.Bibref> list = new ArrayList<>();

    //Mapping the object to class
    object.keySet().stream().forEach((key) -> {

        // We can add more here..
        BibEntries.Bibref bibref = gson.fromJson(object.get(key), BibEntries.Bibref.class);
        list.add(bibref);

        bibEntries.setListBibref(list);
    });

    //Original
    System.out.println(convertedObject);

    // Print the final result
    System.out.println(gson.toJson(bibEntries));
}

public static class BibEntries {
    List<Bibref> listBibref;

    public static class Bibref {
        @SerializedName("ref_id")
        private String refId;

        @SerializedName("title")
        private String title;

        public String getRefId() {
            return refId;
        }

        public void setRefId(final String refId) {
            this.refId = refId;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(final String title) {
            this.title = title;
        }
    }

    public List<Bibref> getListBibref() {
        return listBibref;
    }

    public void setListBibref(final List<Bibref> listBibref) {
        this.listBibref = listBibref;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...