簡體   English   中英

使用GSON和RETROFIT反序列化復雜的JSON對象

[英]Deserializing complex JSON object with GSON and RETROFIT

學習Android原生並停留在GSON反序列化...無法解析來自API的深層嵌套JSON對象響應

返回的數據:

{
  "parent_type": "some_type",
  "data": {
    "children": [
      {
        "id": "some_id",
        "data": {
          "name": "some_name",
          "desc": "bla bla bla"
        }
      },
      {
        "id": "some_other_id",
        "data": {
          "name": "some_other_name",
          "desc": "other bla bla bla"
        }
      }
    ]
  }
}

我有一個RETROFIT客戶,看起來像這樣:

    baseUrl = "https://www.someurl.com/";

    OkHttpClient client = createClientWithInterceptors();

    // create GSON deserializer
    GsonBuilder gsonBuilder = new GsonBuilder();

    gsonBuilder.registerTypeAdapter(Some.class, new SomeDeserializer());
    Gson myGson = gsonBuilder.create();

    _retrofit = new Retrofit.Builder()
            .baseUrl(baseUrl)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create(myGson))
            .build();

GET看起來像這樣:

// end points
public interface Somethings {
    @GET("someendpoint/somthings?limit=2")
    Call<List<Something>> getSomething();
}

然后解串器如下所示:

    public class SubRedditDeserializer implements JsonDeserializer<List<Something>> {
        @Override
        public List<Something> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

        // cant figure out how to handle this here..

        return something;
        }
     }

也無法弄清楚Something類的結構應該看起來是Something 。.它應該是something還是數組?

最后,當Something是時,我希望它成為List<Something>

public class Something {
    public String name;
    public String desc;
}

謝謝

  • 您的JSONJSONObject ,因此List<Something>是錯誤的。

  • 您的Bean是Something ,它是返回JSON值的一部分。因此您可以更改為ResponseBean

嘗試使用這個豆

ResponseBean

public class ResponseBean {

/**
 * parent_type : some_type
 * data : {"children":[{"id":"some_id","data":{"name":"some_name","desc":"bla bla bla"}},{"id":"some_other_id","data":{"name":"some_other_name","desc":"other bla bla bla"}}]}
 */

private String parent_type;
private DataBeanX data;

public String getParent_type() {
    return parent_type;
}

public void setParent_type(String parent_type) {
    this.parent_type = parent_type;
}

public DataBeanX getData() {
    return data;
}

public void setData(DataBeanX data) {
    this.data = data;
}

public static class DataBeanX {
    private List<ChildrenBean> children;

    public List<ChildrenBean> getChildren() {
        return children;
    }

    public void setChildren(List<ChildrenBean> children) {
        this.children = children;
    }

    public static class ChildrenBean {
        /**
         * id : some_id
         * data : {"name":"some_name","desc":"bla bla bla"}
         */

        private String id;
        private DataBean data;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public DataBean getData() {
            return data;
        }

        public void setData(DataBean data) {
            this.data = data;
        }

        public static class DataBean {
            /**
             * name : some_name
             * desc : bla bla bla
             */

            private String name;
            private String desc;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getDesc() {
                return desc;
            }

            public void setDesc(String desc) {
                this.desc = desc;
            }
        }
    }
}
}

然后

@GET("someendpoint/somthings?limit=2")
Call<ResponseBean> getSomething();

並在此使用

@Override
public ResponseBean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

    // cant figure out how to handle this here..

    return something;
}

編輯

[
    {
        "name": 12345,
        "desc": "3"
    },
    {
        "name": 12346,
        "desc": "2"
    },
    {
        "name": 12347,
        "desc": "1"
    }
]

如果上面的代碼類似於JSON ,則可以在代碼中使用List<Something>

使用addConverterFactory(ScalarsConverterFactory.create()),Response返回完整的json作為String。 將String轉換為JsonObject,然后將其解析為模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM