【问题标题】:How to Generate Plain Old Java Objects from following dynamic JSON如何从以下动态 JSON 生成普通的旧 Java 对象
【发布时间】:2019-11-03 21:45:08
【问题描述】:

我需要在 android 中使用 retrofit2JSON 生成 POJO,但问题是标签不时通过提供不同的查询。

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 值正在发生变化,例如 48032354 相似,我不知道高级所有值,所以如何生成 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) {
            }
        });

请告诉我如何解决此类问题。谢谢。

【问题讨论】:

    标签: android json retrofit2 pojo


    【解决方案1】:

    使用动态标签时需要使用hashMap

    喜欢

    public class Pages {
        @SerializedName("pageid")
        @Expose
        private Integer pageid;
        @SerializedName("ns")
        @Expose
        private Integer ns;
        @SerializedName("title")
        @Expose
        private String title;
        @SerializedName("extract")
        @Expose
        private String extract;
    //....
    }
    

    然后在你的回复中使用这个

      if (response.body() != null) {
         Example numberResponse = response.body();
         String keys = numberResponse.getQuery().getPages().toString(); 
         Map<String, Pages> entityList = 
         response.body().getQuery().getPages();
             for (String mapKey : entityList.keySet()) {
             String text = entityList.get(mapKey).getExtract();
                // use text where you want :)
       }}
    

    【讨论】:

      【解决方案2】:

      如果是动态键,您可以使用 Map。例如

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

      其中 yourmodelclassforinsidedynamickeyvalue 是您的模型类

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

      之后,您可以从地图值中获取模型类。如果您需要密钥,您可以从地图密钥中获取。

      【讨论】:

      • 错误已解决,但调用其返回空值的问题请查看我更新的问题@Amit
      猜你喜欢
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2016-04-30
      • 2020-06-08
      • 1970-01-01
      • 2016-09-13
      • 2021-01-28
      • 1970-01-01
      相关资源
      最近更新 更多