![](/img/trans.png)
[英]Proper way to map complex JSON as a Java object with Retrofit and GSON
[英]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;
}
謝謝
您的JSON
是JSONObject
,因此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.