2017-03-01 66 views
3

我必須使用使用JSend格式的API。使用JSend格式將JSON響應轉換爲POJO並進行改造?

它是使用HTTP狀態代碼指示般的地位

長話短說:

  • 200是成功
  • 406是未經授權的

這是很好的,因爲我可以從這個判斷我API請求成功與否。

但是:

由於JSEND格式有它自己的事情,它也有一點點的狀態指示燈在響應就像這樣:

{ 
    status : "success", 
    data : { "post" : { "id" : 2, "title" : "Another blog post", "body" : "More content" }} 
} 

所以它有一個「狀態」字段,也表明API請求是否成功。

問題:

改造作出解析到POJO的響應,因此假定響應只包含模型和成功沒有指標,只是這樣的,例如:(A Post模型實例)

{ "id" : 2, "title" : "Another blog post", "body" : "More content" } 

我的問題是:

有沒有解決方案呢? 我是否可以預分析狀態指示器,拆分響應中的'數據'(模型)部分並對其進行改進以僅解析該部分?

如果沒有,我將不得不爲每個模型添加一個「狀態」屬性,這顯然不是一個可行的方法,我不會那樣做。

如果我只是堅持用手工解析,並在

void onResponse(Call<T> call, Response<T> response);使用ResponseBody,而不是我的模型爲T型放慢參數?

因爲這樣我可以使用.string()並將字符串轉換爲JSON,之後我可以手動解析我的模型,就像爲它們編寫解析器一樣。

我真的很喜歡使用Retrofit的功能進行自動分析,因爲JSend我無法想象如果可以的話,怎麼可能做到這一點。

我不能改變API它會這樣。

回答

4

這是我Response類。

public class Response<T> implements Serializable { 
private T data; 
private String status; 

public T getData() { 
    return data; 
} 

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

public String getStatus() { 
    return status; 
} 

public void setStatus(String status) { 
    this.status = status; 
} 

}

這是我的API調用。

Callback<com.shippn.api.models.Response<T>> callback = new Callback<com.shippn.api.models.Response<T>>() { 
     @Override 
     public void onResponse(Call<com.shippn.api.models.Response<T>> call, Response<com.shippn.api.models.Response<T>> response) { 
      checkStatus(response.body()); 
     } 

     @Override 
     public void onFailure(Call<com.shippn.api.models.Response<T>> call, Throwable t) { 
      fail(); 
     } 
    }; 
    call.enqueue(callback); 

T參數是來自api的數據類型。我的意思是,如果你想獲得Post類型的數據,請將Post insted爲T。如果您想獲得ArrayList<Post>請加ArrayList<Post>

如果data字段在您的API響應中爲空或空,Response.data將爲空或空,它不會拋出異常。

當您從API獲得響應時,首先檢查Response.status是否爲「成功」。如果是「成功」,則從Response獲取數據,如果不是,則執行錯誤操作。

+0

優雅的解決方案。謝謝。 –

+0

我很高興聽到這一點,也感謝賞金@AdamVarhegyi – faranjit

0

你可以做的是你可以擁有發佈請求的狀態而不使用它。 問題是參數名稱不是字符串,並且不會在POJO中解析。但是您可以像這樣獲取您的請求狀態。

@Override 
      public void onResponse(Call<Object> call, retrofit2.Response<Object> response) { 
       alertDialog.dismiss(); 
       if (response.isSuccessful() && response.body() != null) { 
        //if the response is received here it means it was success 
       }else if(response.errorBody()!=null){ 
        //if the response is received here it means it was error 
       } 
      } 

      @Override 
      public void onFailure(Call<Object> call, Throwable t) { 
       //if the response is received here it means it was failure 
       t.printStackTrace(); 
      } 
     }); 

編輯 通過這種方式,你可以有狀態使用POJO,你可以解析錯誤只是在本link

編輯1 此外爲獲得你的正確的錯誤代碼可以將您的回叫類延伸到類似

public class ErrorValues { 
    public int code=0; 
    public String error; 
} 

然後如果請求已完成用error.Inside

else if(response.errorBody()!=null){ 
int error=response.body.code == 404 .... 
        } 

這樣你就可以檢查哪些錯誤代碼是由請求拋出。

0

一種可能的方式是創建你的模型的包裝像

public class Example<T> { 
    String status; 
    T data; 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public T getData() { 
     return data; 
    } 

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