2014-05-09 78 views
0

我從HTTP請求API中獲取不同類型的JSON響應。可能會有幾個來自API的JSON格式選項。例如,它可能是對預期數據的有效響應,但在某些情況下,它可能是內部服務器錯誤詳細消息。Java處理JSON

目前我正在使用Gson將傳入的字符串轉換爲對象,但由於有時它會以不同的格式傳送,因此Gson無法將其轉換爲不同的模板類。

注意: 錯誤並不意味着例外。例如,JSON主體僅包含驗證失敗的信息,例如,調用已成功完成,並且JSON正文爲有效。 HTTP實際上總是成功的,並且將是200.問題是,有時身份驗證可能會失敗,並且它將返回不同的JSON。

String response = restTemplate.getForObject(request, String.class); 
ObjectResponse objResponse = gson.fromJson(response, ObjectResponse.class); 

請問您能否提出更好的做法,以便我可以處理不同類型的響應?或者,也許你知道完全不同的做法。

謝謝!

+1

請注意,HTTP標頭具有狀態碼。你可能想要使用它(200 = OK,404 =未找到,500 =內部服務器錯誤等) – enlait

+0

那麼,你可以像大多數非Java世界一樣做 - 解析地圖和列表,然後檢查生成的樹。如果你需要創建一個對象,寫一個接受Map的構造函數 - 這個流程真的很自然。 –

回答

1

如果你不能預測響應的結構,將其映射到簡單的Java地圖,數組和字符串樹。傑克遜圖書館用'readTree'方法支持這一點。一旦你看到樹並決定它是什麼,你可以讓圖書館將樹映射到一個類的對象。

+0

謝謝!可能這對我來說最適合我! –

1

一種選擇是創建一個表示JSON數據的類,並反序列化爲該類。這樣,如果數據與該結構不匹配,您將得到一個異常。

當您嘗試創建對象並且失敗時,請捕獲該異常並嘗試將其解碼爲一個錯誤 - 然後您可以根據需要處理該案例(以及它可能不是您期望的對象的潛在情況或有效的錯誤)。

+0

錯誤並不意味着例外。例如,JSON主體僅包含驗證失敗的信息,例如,調用已成功完成,並且JSON正文爲有效。 –

+0

@WildGoat事實上,我誤解了你的文章,並認爲你將序列化/反序列化爲JSON類 - 所以試圖反序列化與你的類不匹配的JSON會導致異常。我會更新我的答案。 –

-1

檢查HTTP響應代碼。如果您收到的狀態碼不正確(200),則不應嘗試解析成功的響應。舉例來說,你可以檢查代碼並處理響應這樣的(對象類型不是實際的Java類型,但中給出了一個例子):

MyHttpResponse response = MyHttpHelper.execute(...); 
int status = response.getMyStatusCode(); 
String responseData = response.getStringBody(); 
switch(status) { 
    case 200: { 
     //request is successful, parse valid data 
     break; 
    } 
    default: { 
     //request is not valid, parse error data 
     break; 
    } 
} 
+0

感謝您的回答,但HTTP實際上總是成功,並且將是200.問題是,有時身份驗證可能會失敗,並且它將返回不同的JSON。 –

+0

太糟糕了。狀態碼不應該總是200! – binnyb