1

在我的 android 应用程序中,我得到一个 json 值并通过这样做来遍历它们

    if (response != null) {
        try {
            JSONObject object = new JSONObject(response);
            Iterator enu = object.keys();
            ArrayList<String> locationList = new ArrayList<String>();
            while(enu.hasNext()) {
                locationList.add(object.getString((String) enu.next()));
            }
            callerContext.DisplayLocations(locationList);
        } catch (JSONException e) {
            Toast.makeText(callerContext, callerContext.getResources().getString(R.string.error_message), Toast.LENGTH_LONG).show();
        }
    }

问题是 ArrayList 如果我然后迭代它,值的顺序与我在 php 代码中插入时的顺序不同...

如何以与插入时相同的顺序循环遍历 json 对象?

谢谢。

编辑:

PHP

            $data = array();
            for ($i = 0; $i < $num_records; $i++) {

                array_push($data, 
                    array("id{$i}" => mysql_result($recordset, $i, 'id')), 
                    array("location{$i}" => mysql_result($recordset, $i, 'location')), 
                    array("date{$i}" => mysql_result($recordset, $i, 'date added'))
                );
            }
4

3 回答 3

2

JSON 对象没有或保证顺序,如果需要,请使用 JSON 数组。

于 2013-07-27T19:48:15.170 回答
0

你的 PHP 代码看起来不错。你需要改变你的Java端。尝试这个:

BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()))
StringBuilder content = new StringBuilder();

String line;
while (null != (line = br.readLine()) {
   content.append(line);
}
Object obj=JSONValue.parse(content.toString());
JSONArray jArray=(JSONArray)obj;

//test the order
System.out.println(jArray);

// u may iterate it like this:
for (int i = 0; i < jArray.length(); i++) {
    JSONObject row = jArray.getJSONObject(i);
    // do stuff with all rows now for example:
    String location = row.getString("location");
}

请参阅这两个 Stackoverflow 帖子: Android/Java 中的 JSON 数组迭代从 Java 中的 HTTP 响应解析 JSON 数组

于 2013-07-27T21:42:11.767 回答
0

我不确定您尝试添加哪些值以添加到LocationList. 查看您的代码,您似乎正在将 、 和 的值添加到,id并且您希望以与在 php.ini 中添加它们相同的顺序实现此目的。如果这不正确,请告诉我,我会相应地更新我的答案。无论如何,这应该按顺序添加所有内容:locationdateLocationList

PHP代码:

$data = array();
for ($i = 0; $i < $num_records; $i++) {

    array_push($data, 
        array("id{$i}" => mysql_result($recordset, $i, 'id')), 
        array("location{$i}" => mysql_result($recordset, $i, 'location')), 
        array("date{$i}" => mysql_result($recordset, $i, 'date added'))
    );
}

// This is what I added. Creates a JSON array.
$jsonArray = json_encode($data);

// Then do whatever you want with $jsonArray, perhaps echo it?

Java 代码:

if (response != null) {
    try {
        ArrayList<String> locationList = new ArrayList<String>();
        JSONArray dataArray = new JSONArray(response);
        int length = dataArray.length();

        for (int i = 0; i < length; i++) {
            JSONObject json = dataArray.get(i);
            Iterator enu = json.keys();

            // No need for a loop since JSONObject should only have one key => value pair
            locationList.add(json.getString((String) enu.next()));
        }

        callerContext.DisplayLocations(locationList);
    } catch (JSONException e) {
        Toast.makeText(callerContext, callerContext.getResources().getString(R.string.error_message), Toast.LENGTH_LONG).show();
    }
}
于 2013-07-27T22:29:51.297 回答