我意識到我的問題已經被問了很多,但我花了大量的時間搜索SO和谷歌,試圖更好地理解這個概念,但沒有成功。我見過很多不同的實現,這就是讓我得到一些關於我的具體情況的建議。在java中使用GSON解析JSON並填充列表視圖
我的目標
我需要執行一個POST請求的PHP文件,目標是最終填充字段列表中的活動與一些JSON數據。
HTTP POST響應
這裏是我收到來自服務器,這似乎是陣列的JSON對象返回的響應數據的格式(?)。
{"expense":[{"cat_id_PK":237,"cat_name":"Name1","cat_amount":"100.00","is_recurring":0},
{"cat_id_PK":238,"cat_name":"Name2","cat_amount":"200.00","is_recurring":0},
{"cat_id_PK":239,"cat_name":"Name3","cat_amount":"300.00","is_recurring":0},
{"cat_id_PK":240,"cat_name":"Name4","cat_amount":"400.00","is_recurring":0}],
"expense_rec": [{"cat_id_PK":207,"cat_name":"Name5","cat_amount":"500.00","is_recurring":1}]}
第一個問題
下面的代碼是我用來讀取響應什麼。這是我應該如何處理?看起來很奇怪,得到一個json編碼的響應,然後將其更改爲一個字符串,只是試圖再次訪問json對象的元素。我在這裏錯了嗎?
//This code is in the doInBackground method of my "sendPostRequest" async task.
HttpResponse httpResponse = httpClient.execute(httpPost);
InputStream inputStream = httpResponse.getEntity().getContent();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder stringBuilder = new StringBuilder();
String bufferedStrChunk = null;
while ((bufferedStrChunk = bufferedReader.readLine()) != null) {
stringBuilder.append(bufferedStrChunk);
}
//Returns string to onPostExecute()
return stringBuilder.toString();
第二個問題
我有一個名爲「PostResponse.java」保存下面的代碼我的教程仿照網上的另一個文件。我不確定如何從onPostExecute方法與此類進行交互。我該如何訪問第一個對象中的第一個項目(類似於PHP,您可以這樣做:費用[0] ['cat_name'])。我試圖用各種方式做到這一點,但沒有成功。這裏是PostResponse.java類:
public class PostResponse {
public Integer cat_id_PK;
public String cat_name;
public BigDecimal cat_amount;
public Integer is_recurring;
public int getID() {
return this.cat_id_PK;
}
public void setID(int cat_id_PK){
this.cat_id_PK = cat_id_PK;
}
public String getName() {
return this.cat_name;
}
public void setName(String cat_name) {
this.cat_name = cat_name;
}
public BigDecimal getAmount() {
return this.cat_amount;
}
public void setAmount(BigDecimal cat_amount) {
this.cat_amount = cat_amount;
}
public int getRecurring() {
return this.is_recurring;
}
public void setRecurring(int is_recurring) {
this.is_recurring = is_recurring;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("*** Categories ***");
sb.append("cat_id_PK="+getID()+"\n");
sb.append("cat_name="+getName()+"\n");
sb.append("cat_amount="+getAmount()+"\n");
sb.append("is_recurring="+getRecurring()+"\n");
return sb.toString();
}
}
,這裏是我的onPostExecute方法的內容:
protected void onPostExecute(String result) {
super.onPostExecute(result);
Gson gson = new Gson();
PostResponse response = gson.fromJson(result, PostResponse.class);
System.out.println(result);
}
就像我最初說,我的最終目標是要填充這些項目到一個列表活動,但在這一點上,我只想知道如何獲得特定元素。但是,如果任何人想要在他們的回覆中包含如何填充列表活動,那麼會爲我節省更多麻煩,因爲對於我來說,沒有任何Java使用起來很容易!
我實現了你的建議,但現在我得到一個錯誤:「期望的字符串,但是BEGIN_OBJECT」。我猜它與我的asynctask期待一個字符串並返回一個字符串的事實有關,同時我的doInBackground方法需要一個字符串並返回一個字符串給我的onPostExecute,它也期望一個字符串。我在我的POJO中使用了數組,並使用PostResponse response = new Gson()。fromJson(bufferedReader,PostResponse.class); – hyphen 2014-10-17 12:17:50
順便說一句 - 你的建議已經超級有用,所以謝謝你! – hyphen 2014-10-17 12:18:31
@hyphen:你所描述的錯誤通常是試圖將一個複雜的json對象(在'{...}'之間的東西)映射到一個java字符串上的結果。把它看作是一種類型不匹配,其中Java對象不能正確建模json。基本上,任何介於'{...}'之間的東西都應該有一個Java中的等價對象。看看周圍,你會發現很多類似的問題和他們的解決方案。如果這沒有幫助,也許考慮用你的進度更新問題,以便我們可以從那裏繼續。 – 2014-10-17 14:23:10