Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GSON反序列化复杂的JSON对象并进行改进_Java_Android_Retrofit_Gson - Fatal编程技术网

Java 使用GSON反序列化复杂的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" }

学习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"
        }
      }
    ]
  }
}
我有一个改装客户,看起来像这样:

    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

试着用这个豆子

响应bean

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
实例,添加到
列表中并返回它。很难看,但很管用