【问题标题】:Error in Android JsonDeserializer when returning response返回响应时Android JsonDeserializer出错
【发布时间】:2016-08-27 14:34:00
【问题描述】:

我是新来的,我有一个无法解决的问题。

我在执行时的调试中遇到了这个错误:

05-02 11:56:07.539  18645-24466/com.appss.appssapp D/Retrofit﹕ java.lang.NullPointerException: Null pointer exception during instruction 'invoke-static {v0, v2}, java.util.ArrayList com.appss.appssapp.io.model.PostsResponse$MainResponse.access$002(com.appss.appssapp.io.model.PostsResponse$MainResponse, java.util.ArrayList) // method@19256'
at com.appss.appssapp.io.model.PostsResponse.setPosts(PostsResponse.java:21)
            at com.appss.appssapp.io.deserializer.PostsResponseDeserializer.deserialize(PostsResponseDeserializer.java:31)
            at com.appss.appssapp.io.deserializer.PostsResponseDeserializer.deserialize(PostsResponseDeserializer.java:21)
            at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
            at com.google.gson.Gson.fromJson(Gson.java:810)
            at com.google.gson.Gson.fromJson(Gson.java:775)
            at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:63)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:367)
            at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
            at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
            at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at retrofit.Platform$Android$2$1.run(Platform.java:142)
            at java.lang.Thread.run(Thread.java:818)

应用程序编译正确,运行没有问题,但是当我调用 api 时不显示数据,我的意思是,api 发送数据,我做我必须做的事情,但是当我尝试将 de 数据发送到调试中的响应时,会显示我上面写的问题。

这是我的代码。

Posts.JAVA

public class Posts {
    String id; //Id de la publicacion
    String titulo; // Titulo de la publicacion
    String url; // Url de la publicacion
    String imagen; // Imagen cover la publicacion
    String autor_nick; // Nick del autor de la publicacion
    String visitas; // Lecturas de la publicacion
    String comentarios; // Cantidad de comentarios de la publicacion
    public Posts () {}
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getTitulo() {
        return titulo;
    }
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getImagen() {
        return imagen;
    }
    public void setImagen(String imagen) {
        this.imagen = imagen;
    }
    public String getAutor_nick() {
        return autor_nick;
    }
    public void setAutor_nick(String autor_nick) {
        this.autor_nick = autor_nick;
    }
    public String getVisitas() {
        return visitas;
    }
    public void setVisitas(String visitas) {
        this.visitas = visitas;
    }
    public String getComentarios() {
        return comentarios;
    }
    public void setComentarios(String comentarios) {
        this.comentarios = comentarios;
    }
}

PostsResponse.JAVA

public class PostsResponse {

    private MainResponse mainResponse;

    public ArrayList<Posts> getPosts(){
        return  mainResponse.posts;
    }

    public void setPosts(ArrayList<Posts> posts) {
        mainResponse.posts = posts;
    }

    private class MainResponse {

        private ArrayList<Posts> posts;

    }
}

PostResponseDeserializer.JAVA

public class PostsResponseDeserializer implements JsonDeserializer<PostsResponse> {
    @Override
    public PostsResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        Gson gson = new Gson();
        PostsResponse response = gson.fromJson(json, PostsResponse.class);

        JsonObject postsResponseData = json.getAsJsonObject();

        JsonArray postsArray = postsResponseData.getAsJsonArray("posts");

        response.setPosts(extractPostsFromJsonArray(postsArray));

        return response;
    }

    private ArrayList<Posts> extractPostsFromJsonArray(JsonArray postsArray) {
        ArrayList<Posts> posts = new ArrayList<>();
        for (int i = 0; i < postsArray.size(); i++) {

            JsonObject postsDatos = postsArray.get(i).getAsJsonObject();

            Posts actualPost = new Posts();
            String titulo = postsDatos.get("titulo").getAsString();
            String imagen = postsDatos.get("imagen_370x208").getAsString();
            String visitas = postsDatos.get("visitas").getAsString();

            actualPost.setTitulo(titulo);
            actualPost.setImagen(imagen);
            actualPost.setVisitas(visitas);

            posts.add(actualPost);
        }
        return posts;
    }
}

我认为问题可能出在这里 response.setPosts(extractPostsFromJsonArray(postsArray));

但我不知道为什么会这样。

有什么帮助吗? ..对不起我的英语不好。

【问题讨论】:

    标签: java android api retrofit serialization


    【解决方案1】:

    我不确定,但请检查一下。

    当您调用 setposts 方法时,它将尝试初始化一个数组列表,而包含该列表的对象未初始化。所以你应该先新建一个 MainResponse 实例。

    【讨论】:

    • 我是 android 和 Java 的新手。你给我的答案解决了我的问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    相关资源
    最近更新 更多