Android / Java中的JSON数组迭代

我正在构build一个需要下载并与在线数据库同步的android应用程序,我正在从应用程序发送我的查询到一个php页面,从JSON格式的数据库返回相关的行。

有人可以告诉我迭代通过JSON数组的最佳方式?

我收到一个对象数组:

[{json object},{json object},{json object}]

我可以用来访问数组中的JSONObjects的最简单的代码是什么?

编辑:现在我想到了我用来迭代循环的方法是:

 for (String row: json){ id = row.getInt("id"); name = row.getString("name"); password = row.getString("password"); } 

所以我想我已经能够把返回的Json转换成可迭代的数组。 任何想法我怎么能做到这一点?

我为自己的迷茫道歉,但是我从网上find的一个例子中find了这个工作,之后一直无法find它。

我做了两种不同的方式,

1.)制作一个地图

  HashMap<String, String> applicationSettings = new HashMap<String,String>(); for(int i=0; i<settings.length(); i++){ String value = settings.getJSONObject(i).getString("value"); String name = settings.getJSONObject(i).getString("name"); applicationSettings.put(name, value); } 

2.)制作一个JSONArray的名字

  JSONArray names = json.names(); JSONArray values = json.toJSONArray(names); for(int i=0; i<values.length(); i++){ if (names.getString(i).equals("description")){ setDescription(values.getString(i)); } else if (names.getString(i).equals("expiryDate")){ String dateString = values.getString(i); setExpiryDate(stringToDateHelper(dateString)); } else if (names.getString(i).equals("id")){ setId(values.getLong(i)); } else if (names.getString(i).equals("offerCode")){ setOfferCode(values.getString(i)); } else if (names.getString(i).equals("startDate")){ String dateString = values.getString(i); setStartDate(stringToDateHelper(dateString)); } else if (names.getString(i).equals("title")){ setTitle(values.getString(i)); } } 

我认为这段代码简短明了:

 int id; String name; JSONArray array = new JSONArray(string_of_json_array); for (int i = 0; i < array.length(); i++) { JSONObject row = array.getJSONObject(i); id = row.getInt("id"); name = row.getString("name"); } 

那是你在找什么?

这篇文章帮助我开始使用JSON和Android:

http://www.androidcompetencycenter.com/2009/10/json-parsing-in-android/

在数组上,寻找:

 JSONArray menuitemArray = popupObject.getJSONArray("menuitem"); 

不幸的是,JSONArray不支持每个语句,如:

 for(JSONObject someObj : someJsonArray) { // do something about someObj .... .... } 

使用jacksonJava JSON处理器 ,它也可用于Android。

有几种方法可以parsingJSON:

  • stream媒体(如萨克斯)
  • 树(如DOM)
  • 对象映射(如JAXB)

编辑:

拿org.json类, 已经在 android API中。

如果您使用的是开源的JSON.org Java实现 ,那么可以让JSONArray实现Iterable接口,并将以下方法添加到该类中:

 @Override public Iterator iterator() { return this.myArrayList.iterator(); } 

这将使JSONArray的所有实例都可迭代,这意味着for (Object foo : bar)语法现在可以与它一起工作(请注意,foo必须是Object,因为JSONArrays没有声明types)。 所有这些工作,因为JSONArray类是由一个简单的ArrayList,这已经是可迭代的支持。 我想其他的开源实现将会很容易改变。

每个条目都使用相同的Cast对象。 在每次迭代中,您只需更改同一个对象,而不是创build一个新对象。

这段代码应该修复它:

 JSONArray jCastArr = jObj.getJSONArray("abridged_cast"); ArrayList<Cast> castList= new ArrayList<Cast>(); for (int i=0; i < jCastArr.length(); i++) { Cast person = new Cast(); // create a new object here JSONObject jpersonObj = jCastArr.getJSONObject(i); person.castId = (String) jpersonObj.getString("id"); person.castFullName = (String) jpersonObj.getString("name"); castList.add(person); } details.castList = castList; 

在迭代JSON数组(org.json.JSONArray,内置于Android)时,请注意对象; 例如,您可能会得到"null"而不是string。

支票可能如下所示:

 s[i] = array.isNull(i) ? null : array.getString(i); 

当我尝试@ vipw的build议时,我遇到了这个exception: The method getJSONObject(int) is undefined for the type JSONArray

这为我工作,而不是:

 int myJsonArraySize = myJsonArray.size(); for (int i = 0; i < myJsonArraySize; i++) { JSONObject myJsonObject = (JSONObject) myJsonArray.get(i); // Do whatever you have to do to myJsonObject... } 

希望这将有助于需要迭代使用JSONObject的人

 for(Object object: jsonArray){ JSONObject jsonObject = (JSONObject) object; // Then you can go on from here }