2015-10-26 65 views
2

在我的應用程序中,我從我的Web服務器請求JSON數據,並且響應幾乎總是不一樣。如何處理數十種不同的JSON響應?

例如,一個響應可能是這樣的:

{"success":true,"data":{"token_id":"pPt9AKl0Cg","token_key":"8ax224sFrJZZkStAQuER"}} 

而另一種可能是這樣的:

{"success":true,"data":{"user_id":"20","username":"Bob"}} 

而另一個可能是這樣的:

{"success":true,"data":{"user_id":"20","stats":{"followers":"500","following":"12"}}} 

以前,我爲每種不同的響應類型創建了一個模型類(Java)。例如,對於上面的第一個反應,我的模型類可能是這樣的:

public class MyResponseModel { 
     private boolean success; 
     private DataModel data; 

    public static class DataModel { 
     private String token_id; 
     private String token_key; 
    } 

    ... 
} 

這真的是這樣做的最佳方式?因爲如果我爲我的應用程序打了十幾個+響應,我會得到十幾個不同的模型類,每個響應類型都有一個。

是否有替代解析JSON?

謝謝。

+1

可能最好只是有一個請求類,有你現在的結構。無論這個類是否提供回調,請求處理程序都返回'data'參數。這樣請求者不需要知道(或關心)它在做什麼。它只是將一些數據發送到服務器,然後將響應回傳給任何想要的。 –

+0

我很困惑,我將如何解析'data'中的內容? – user5486944

+0

無論請求它應該做解析。 –

回答

1

對於每種類型的響應,您將需要一個DTO或模型類。需要靜態類型來從/到json序列化/反序列化。您可以使用泛型來包裝響應。重構你的代碼,這將是這樣的:

public class MyResponseModel <T> { 
     private boolean success; 
     private T data; 
} 
public class DataModel { 
     private String token_id; 
     private String token_key; 
} 

然後你的代碼可以返回MyResponseModel<DataModel>對象爲這種情況。

如果您確實想要爲每種類型的響應使用一個類,則需要將所有響應表示爲鍵值對,然後可以讓一個類包含Map。我不會推薦這種方法,並且希望每種類型的響應都有一個類。