Android JSON数组计数



因此,随着我对Android的深入研究,我开始使用JSON并加载到RecyclerView中。现在,除了强制加载的数量外,它工作得很好。目前我正在加载40个项目,这就是我的网站上的内容。现在,如果我在网站上创建一个新帖子,我的应用程序会出错,因为它与我在FOR循环中声明的数量不匹配。

我的问题是,我如何使循环不被强制到特定数量的结果,并将它们全部获取?

private void parsejson(String response) {
List<DataMembers> data = new ArrayList<>();
try {
JSONArray jsonArray = new JSONArray(response);
for(int i=0;i<40;++i) {
DataMembers dataMembers = new DataMembers();
JSONObject jsonObject = new JSONObject();
jsonObject = (JSONObject) jsonArray.get(i);
Log.i("Imported: ", Integer.toString(jsonObject.getInt("id")));
JSONObject jsonObject1 = new JSONObject();
JSONObject jsonObject2 = new JSONObject();
JSONObject jsonObject3 = new JSONObject();
JSONObject jsonObject4 = new JSONObject();
jsonObject1 = (JSONObject) jsonObject.get("title");
jsonObject3 = (JSONObject) jsonObject.get("excerpt");
jsonObject4 = (JSONObject) jsonObject.get("better_featured_image");
jsonObject2 = (JSONObject) jsonObject.get("content");
dataMembers.postTitle = jsonObject1.getString("rendered");
dataMembers.postCode = jsonObject2.getString("rendered");
dataMembers.postExcerpt = jsonObject3.getString("rendered");
dataMembers.imgurl = jsonObject4.getString("source_url");
dataMembers.postId = jsonObject.getInt("id");
temp[i] = dataMembers.postCode;
dataMembers.posturl = jsonObject.getString("link");
data.add(dataMembers);
}
rview.setAdapter(new RecyclerAdapter(RestActivity.this,data));
}
catch (Exception e) {
e.printStackTrace();
}
}

使用JsonArray.length((

JsonArray.length((给出JsonArray的大小或计数。

int length = jsonArray.length();

private void parsejson(String response) {
List<DataMembers> data = new ArrayList<>();
try {
JSONArray jsonArray = new JSONArray(response);
for(int i=0;i< jsonArray.length();++i) 
{
DataMembers dataMembers = new DataMembers();
// The rest of the code goes here
} // End for
}  // End Try
}    // End method parsejson

https://developer.android.com/reference/org/json/JSONArray

这就是您的代码应该是

try {
JSONArray jsonArray = new JSONArray(response);
for(int i=0; i<jsonArray.length(); ++i) {
DataMembers dataMembers = new DataMembers();
JSONObject members = jsonArray.getJSONObject(i);
Log.i("Imported: ", Integer.toString(members.getInt("id")));
JSONObject title = members.getJSONObject("title");
JSONObject exercpt = members.getJSONObject("excerpt");
JSONObject image = members.getJSONObject("better_featured_image");
JSONObject content = members.getJSONObject("content");
dataMembers.postTitle = title.getString("rendered");
dataMembers.postCode = content.getString("rendered");
dataMembers.postExcerpt = exercpt.getString("rendered");
dataMembers.imgurl = image.getString("source_url");
dataMembers.postId = members.getInt("id");
temp[i] = dataMembers.postCode;
dataMembers.posturl = members.getString("link");
data.add(dataMembers);
}
rview.setAdapter(new RecyclerAdapter(RestActivity.this,data));
}
catch (Exception e) {
e.printStackTrace();
}

使用JSONArray的长度,而不是硬编码的数字。也不要做类似的事情

JSONObject jsonObject1 = new JSONObject();
jsonObject1 = (JSONObject) jsonObject.get("title");

它使用new JSONObject()创建了一个完全不必要的对象,然后将其丢弃。之后也停止使用get并强制转换为JSONObject。相反,当您想实际分配变量的值并使用getJSONObject时,请声明该变量。另外,给变量起一个有意义的名字。

JSONObject title = members.getJSONObject("title");

我认为Jdk 8可以帮助。。。再加上一些句法糖。

遍历JSONArray,为每个对象传递一个函数。。。这样,您就不需要计数/长度。

JSONArray jsonArray = new JSONArray(response);
try {
jsonArray.forEach(obj -> {                               //looping through the Array
//All other things goes here... 
});   
} catch (JSONException j) {
log.e("JSON 'PUFF' EXCEPTION", j.getMessage());
}

最新更新