Как генерировать простые старые объекты Java из следующего динамического JSON - PullRequest
0 голосов
/ 04 ноября 2019

Мне нужно сгенерировать POJO из JSON , используя retrofit2 в Android, но проблема в том, что тег меняется время от времени, предоставляя различные запросы.

JSON 1

{ "query":{
      "pages":{
         "4803":{
            "pageid":4803,
            "ns":0,
            "title":"hello",
            "extract":"Greating to some one"
  }}}}

JSON 2

{ "query":{
      "pages":{
         "2354":{
            "pageid":2354,
            "ns":0,
            "title":"Nice",
            "extract":"Say Appreciation to someone"
  }}}}

В приведенных выше 2 значениях JSON изменяется, например, 4803 и 2354 similary Я не знаю в заранее все значения, так как для генерации POJO для этого я много пробовал на JSONtoPOJO , ноон создает классы с именами _4803 и _2354 , но на самом деле значение изменяется, предоставляя другой запрос к API.

Вот мой полный код Java 1.

public class Example {
    @SerializedName("query")
    @Expose
    private Query query;

    public Query getQuery() {
        return query;
    }

    public void setQuery(Query query) {
        this.query = query;
    }
}

2.

public class modelClass {
    @SerializedName("pageid")
    @Expose
    private Integer pageid;
    @SerializedName("ns")
    @Expose
    private Integer ns;
    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("extract")
    @Expose
    private String extract;

    public Integer getPageid() {
        return pageid;
    }

    public void setPageid(Integer pageid) {
        this.pageid = pageid;
    }

    public Integer getNs() {
        return ns;
    }

    public void setNs(Integer ns) {
        this.ns = ns;
    }

    public String getTitle() {
        return title;
    }

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

    public String getExtract() {
        return extract;
    }

    public void setExtract(String extract) {
        this.extract = extract;
    }
}

3.

public class Pages {
    @SerializedName("pages")
    @Expose
    private Map<String, modelClass> page;

    public Map<String, modelClass> getPage() {
        return page;
    }

    public void setPage(Map<String, modelClass> page) {
        this.page = page;
    }
}

5.

public class Query {

    @SerializedName("pages")
    @Expose
    private Pages pages;

    public Pages getPages() {
        return pages;
    }

    public void setPages(Pages pages) {
        this.pages = pages;
    }
}

6. Вызовите из mainActivity , но верните nullpointerException, чтобы узнать ответ значения.

ApiService apiService = RetroClient.getApiService();
        Call<Example> call = apiService.getWordList(//here i passed value, that return json//);

        call.enqueue(new Callback<Example>() {
            @Override
            public void onResponse(Call<Example> call, Response<Example> response) {
                if (response.body() != null) {
                 // how get json value here
                }
            }

            @Override
            public void onFailure(Call<Example> call, Throwable t) {
            }
        });

Скажите, пожалуйста, как решить такую ​​проблему. спасибо.

1 Ответ

2 голосов
/ 04 ноября 2019

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

 @SerializedName("pages")
@Expose
private Map<String, yourmodelclassforinsidedynamickeyvalue> page;

, где yourmodelclassforinsidedynamickeyvalue - это класс вашей модели для

"pageid":2354,
"ns":0,
"title":"Nice",
"extract":"Say Appreciation to someone"

После этого из значения карты вы можете получить класс вашей модели. если вам нужен ключ, вы можете получить его из ключа карты.

...