解析从webservice到android的Json数组

时间:2016-06-13 07:24:48

标签: java android json android-volley

我正在尝试使用volley将此json数据从Web服务解析为android。 这是要解析的json数组。

[
 {
    "id":"1",
    "conf_room_name":"Tadoba"
 },
 {
    "id":"2",
    "conf_room_name":"Melghat"
 },
 {
    "id":"3",
    "conf_room_name":"Ranthambore"
 },
 {
    "id":"4",
    "conf_room_name":"Corbett"
 },
 {
    "id":"5",
    "conf_room_name":"Pench"
 }
]
[
 {
    "id":"1",
    "area":"Mafatlal"
 },
 {
    "id":"2",
    "area":"Andheri"
 }
]
[
 {
    "id":"1",
    "type":"Is Personal"
 },
 {
    "id":"2",
    "type":"Meeting"
 }
]

我正在使用此代码从我的json数组对象中获取不同的arraylists的值。

RequestQueue requestQueue2 = Volley.newRequestQueue(this);        // RequestQueue requestQueue3 = Volley.newRequestQueue(this);

    //  Create json array request
    JsonArrayRequest jsonArrayRequest=new JsonArrayRequest(Request.Method.POST,"http://170.241.241.198/test.php",new Response.Listener<JSONArray>(){
        public void onResponse(JSONArray jsonArray){


            for(int i=0;i<jsonArray.length();i++){
                try {
                    JSONObject jsonObject=jsonArray.getJSONObject(i);
                    stringArray_conf.add(jsonObject.getString("conf_room_name"));
                    stringArray_area.add(jsonObject.getString("area"));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }


        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            Log.e("Error", "Unable to parse json array");
        }
    });

    requestQueue2.add(jsonArrayRequest);

只有第一个阵列正确填充而不是另一个阵列。每当我尝试使用第二个arraylist中的值时,我都会出现outofboundsindex异常。

所有这些只在按钮点击时发生,我希望在我加载页面时发生这种情况。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

将JSON设为数组,如下所示:

[
  [
    {
      "id": "1",
      "conf_room_name": "Tadoba"
    },
    {
      "id": "2",
      "conf_room_name": "Melghat"
    },
    {
      "id": "3",
      "conf_room_name": "Ranthambore"
    },
    {
      "id": "4",
      "conf_room_name": "Corbett"
    },
    {
      "id": "5",
      "conf_room_name": "Pench"
    }
  ],
  [
    {
      "id": "1",
      "area": "Mafatlal"
    },
    {
      "id": "2",
      "area": "Andheri"
    }
  ],
  [
    {
      "id": "1",
      "type": "Is Personal"
    },
    {
      "id": "2",
      "type": "Meeting"
    }
  ]
]

或对象(更容易阅读和理解):

{
  "rooms": [
    {
      "id": "1",
      "conf_room_name": "Tadoba"
    },
    {
      "id": "2",
      "conf_room_name": "Melghat"
    },
    {
      "id": "3",
      "conf_room_name": "Ranthambore"
    },
    {
      "id": "4",
      "conf_room_name": "Corbett"
    },
    {
      "id": "5",
      "conf_room_name": "Pench"
    }
  ],
  "areas": [
    {
      "id": "1",
      "area": "Mafatlal"
    },
    {
      "id": "2",
      "area": "Andheri"
    }
  ],
  "types": [
    {
      "id": "1",
      "type": "Is Personal"
    },
    {
      "id": "2",
      "type": "Meeting"
    }
  ]
}

PHP代码可能如下所示:

<?php

$sqlroom = mysql_query("SELECT * FROM `room_table`");
$room_rows = array();
while($r = mysql_fetch_assoc($sqlroom)) {
  $room_rows[] = $r;
}

$sqlarea = mysql_query("SELECT * FROM `area_table`");
$area_rows = array();
while($r = mysql_fetch_assoc($sqlarea)) {
  $area_rows[] = $r;
}

$sqltype = mysql_query("SELECT * FROM `type_table`");
$type_rows = array();
while($r = mysql_fetch_assoc($sqltype)) {
  $type_rows[] = $r;
}

$result = array();
$result["rooms"] = $room_rows;
$result["areas"] = $area_rows;
$result["types"] = $type_rows;

echo json_encode($result);

?>

答案 1 :(得分:0)

您似乎试图解析三种不同类型的数据:会议室,区域(可能包含会议室?)和一些有关任何一种的信息(虽然不清楚哪些)。因此,尝试将它们存储在单个数组中是没有意义的,因为与其他两个元素相比,每个元素包含不同的数据结构。

如果type是对其他两个对象之一的描述,那么它应该在该对象中包含,而不是作为单独的对象处理。一个房间必然必须坐在一个区域内,但也可以将它放在那里。

你说你是“从mysql服务器中提取所有这些值然后使用php来编码json数据,这给了我json数组的结构”这意味着你没有直接访问权限到JSON结构,但您仍然可以访问PHP结构。 JSON编码器将使用PHP数组/对象的设计来构造JSON,为此,您需要在序列化过程的任一端创建或多或少匹配的PHP和Java对象。

例如:

$obj = (object) array
  ('id' => '1', 'area' => 'Mafatlal', 'rooms' => array
    ('id' => '1', 'conf_room_name' => 'Tadoba', 'type' => 'Is Personal'),
    ...
  ('id' => '2', 'area' => 'Andheri', 'rooms' => array...
  );

public class Area {
    private int id;
    private String area;
    private Room[] rooms;

}

public class Room {
    private int id;
    private String conf_room_name;
    private String type;
}

请注意,与通常的Java驼峰式命名约定相反,对象变量通常必须匹配传入的JSON变量名称(即:conf_room_name而不是confRoomName)。

答案 2 :(得分:0)

您需要使用for循环添加值。

        for(int i=0;i<jsonArray.length();i++){
            try {
                JSONObject jsonObject=jsonArray.getJSONObject(i);
                if(jsonObject.toString.contains("conf_room_name"))
                  stringArray_conf.add(jsonObject.getString("conf_room_name"));
                else if(jsonObject.toString.contains("area"))
                  stringArray_area.add(jsonObject.getString("area"));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }