我意识到我的问题已经被问了很多,但我花了大量的时间搜索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