Java 使用GSON反序列化复杂的JSON对象并进行改进
学习android本机并坚持使用GSON反序列化。。。 无法分析来自API的深层嵌套JSON对象响应 返回的数据:Java 使用GSON反序列化复杂的JSON对象并进行改进,java,android,retrofit,gson,Java,Android,Retrofit,Gson,学习android本机并坚持使用GSON反序列化。。。 无法分析来自API的深层嵌套JSON对象响应 返回的数据: { "parent_type": "some_type", "data": { "children": [ { "id": "some_id", "data": { "name": "some_name", "desc": "bla bla bla" }
{
"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"
}
}
]
}
}
我有一个改装客户,看起来像这样:
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();
// 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;
}
}
GET看起来像这样:
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();
// 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;
}
}
感谢使用addConverterFactory(ScalarsConverterFactory.create()),响应返回完整的json作为字符串。将字符串转换为JsonObject,然后将其解析到您的模型中。- 您的
是JSON
,因此JSONObject
是错误的列表
- 您的Bean是
,它是返回Something
值的一部分。因此您可以更改为JSON
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;
}
}
}
}
}
编辑
[
{
"name": 12345,
"desc": "3"
},
{
"name": 12346,
"desc": "2"
},
{
"name": 12347,
"desc": "1"
}
]
如果您的
JSON
与上面的代码相似,您可以在代码中使用List
。阅读改装教程。对于反序列化json,首先将数据返回字符串复制到pojo-onile工具(如jsonutils.com)中,并获得正确的模型,改装可以将返回数据自动反序列化到模型中。链接中的教程介绍了改装的所有基础知识以及嵌套json解析。你能检查一下我的答案吗?KeLiuyue我确实看到了对答案的评论。据我所知,在这个答案中,我将结果解析为相同的结构,而我所要做的是从每个孩子那里只获得数据的列表。我怎样才能做到这一点?KeLiuyue你能举个例子,说明我在得到ResponseBean
对象后如何使用它吗?我还注意到反序列化程序甚至没有这样使用,对吗?KeLiuyue-它在工作,但再一次,我最终得到了与响应相同的结构,我想在最后得到的是编辑中的结构。我遗漏了什么?因此最终无法避免在反序列化程序中获取子对象的数组,循环遍历每个子对象,并转换到新的Something
实例,添加到列表中并返回它。很难看,但很管用