返回响应时Android JsonDeserializer出错

时间:2016-05-02 18:19:43

标签: java android api retrofit serializer

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

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

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));

但我无法弄清楚为什么会这样。

有任何帮助吗? ..抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

我不确定但是检查一下。

当你调用setposts方法时,它会尝试初始化一个arraylist而包含该列表的对象没有被初始化。所以你应该首先新建一个MainResponse实例。