Android/Java 中的 JSON 数组迭代
Posted
技术标签:
【中文标题】Android/Java 中的 JSON 数组迭代【英文标题】:JSON Array iteration in Android/Java 【发布时间】:2011-03-25 10:50:31 【问题描述】:我正在构建一个需要下载并与在线数据库同步的 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 转换为可迭代数组。有什么想法可以实现吗?
我为我的含糊之处道歉,但我从网上找到的一个例子中得到了这个结果,此后一直找不到它。
【问题讨论】:
查看以下链接:androidbeasts.wordpress.com/2015/08/04/json-parsing-tutorial 【参考方案1】:我认为这段代码简洁明了:
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");
这就是你要找的吗?
【讨论】:
又好又简单!效果很好! 注意,如果你发送一个没有连续数字的“数组”,你必须使用JSONObject 是的,它很完美,但是虽然数据量很大,但它的处理速度非常慢:( @ArslanAhmad 如果你有大量数据,你不希望在内存中构造整个 json 对象数组。而是使用类似 SAX 的方法。见这里:***.com/questions/10657725/… 这对我不起作用。由于对象周围的“”括号,我得到一个 JSON 异常?【参考方案2】:我有两种不同的方法,
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));
【讨论】:
【参考方案3】:很遗憾,JSONArray
不支持foreach
语句,例如:
for(JSONObject someObj : someJsonArray)
// do something about someObj
....
....
【讨论】:
可以,但它返回的对象不是 JSONObject JSONArray 类没有实现 Iterable 接口【参考方案4】:当我尝试@vipw 的建议时,我遇到了这个异常:
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...
【讨论】:
对于 android,我将 myJsonArray.size() 改为 myJsonArray.length()【参考方案5】:如果你使用的是JSON.org Java implementation,它是开源的,你可以让JSONArray实现Iterable
接口,并在类中添加以下方法:
@Override
public Iterator iterator()
return this.myArrayList.iterator();
这将使 JSONArray 的所有实例都可迭代,这意味着 for (Object foo : bar)
语法现在可以使用它(注意 foo 必须是一个对象,因为 JSONArrays 没有声明的类型)。所有这些都有效,因为 JSONArray 类由一个简单的 ArrayList 支持,该 ArrayList 已经是可迭代的。我想其他开源实现也一样容易改变。
【讨论】:
有趣的是,JSON.org 实现曾经在 JSONArray 类中有一个迭代器,但他们删除了它:github.com/douglascrockford/JSON-java/commit/… @vipw 我曾经向他们发送过关于实现 Iterable 的电子邮件,但他们说最终他们不能这样做,因为这会破坏与 Java 1.4 的兼容性。也许这就是它在提交中被删除的原因。【参考方案6】:在数组上,寻找:
JSONArray menuitemArray = popupObject.getJSONArray("menuitem");
【讨论】:
【参考方案7】:您为每个条目使用相同的 Cast 对象。 在每次迭代中,您只是更改了同一个对象而不是创建一个新对象。
这段代码应该可以修复它:
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;
【讨论】:
【参考方案8】:在遍历 JSON 数组(org.json.JSONArray,Android 内置)时,请注意 null 对象;例如,您可能会得到 "null"
而不是 null 字符串。
支票可能如下所示:
s[i] = array.isNull(i) ? null : array.getString(i);
【讨论】:
以上是关于Android/Java 中的 JSON 数组迭代的主要内容,如果未能解决你的问题,请参考以下文章
在 android [JAVA] 中的多个 Arraylist 中添加 JSON 数组