2015-11-23 86 views
2

我使用改造2消耗的JSON API時,我有以下JSON結構空指針試圖訪問POJO屬性

{ 
    "data": { 
     "id": 1, 
     "name": "Josh" 
    } 
} 

User POJO看起來像:

public class User { 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

和我用戶界面

@GET("/api/v1/me") 
Call<User> me(); 

但我當我嘗試做response.body().getName()我得到 空指針異常。

爲JSON響應POJO:

其發出請求

UserService userService = ServiceGenerator.createService(UserService.class) 

    Call<User> call = userService.me(); 

    call.enqueue(new Callback<User>() { 
     @Override 
     public void onResponse(Response<User> response, Retrofit retrofit) { 
      if(response.isSuccess()) { 
       Log.i("user", response.body().getName().toString()); 
      } 

     } 

     @Override 
     public void onFailure(Throwable t) { 
      Log.i("hello", t.getMessage()); 
     } 
    }); 
+2

你的名字屬性在數據屬性中,因此反序列化是不正確的 – cafebabe1991

+0

@ cafebabe1991是這是我認爲,從POJO的數據屬性中獲取它的正確方法是什麼? – joshuahornby10

+0

你可以創建另一個pojo,在那裏有Data對象屬性...所以首先從響應中獲得Data,從中獲取名稱和id。 – cafebabe1991

回答

1

應該創建POJO類的代碼如下

public class User { 


    private Data data; 


    public Data getData() { 
     return data; 
    } 


    public void setData(Data data) { 
     this.data = data; 
    } 

} 

POJO用於​​內部數據:。

public class Data { 


    private int id; 

    private String name; 


    public int getId() { 
     return id; 
    } 


    public void setId(int id) { 
     this.id = id; 
    } 


    public String getName() { 
     return name; 
    } 


    public void setName(String name) { 
     this.name = name; 
    } 

} 

不是使用response.body()的getData()的getName()以響應訪問名稱。

1
public class Data { 

    private User data; 

    public String getData() { 
     return data; 
    } 

    public void setName(User data) { 
     this.data = data; 
    } 
} 
Access it like this 
public void onResponse(Response<Data> response, Retrofit retrofit) { 
     if(response.isSuccess()) { 
      Log.i("user", response.body().getData().getName().toString()); 
     } 

    }