解析JSON数组从webservice到android
我想解析从web服务这个json数据到android使用齐射。 这是要解析的json数组。解析JSON数组从webservice到android
[
{
"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数组对象中取出不同的数组列表中的值。
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);
只有第一个数组被正确填充而不是另一个。每当我尝试使用来自第二个数组列表的值时,我都会出现outofboundsindex异常。
所有这一切发生在一个按钮上点击只我想这发生在我加载我的网页时。
任何帮助将不胜感激。
使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);
?>
我拉从MySQL服务器的所有这些值,然后使用PHP编码JSON数据,这给了我的JSON数组的结构。是否有可能使用php和mysql来创建这种结构? –
当然,你应该控制JSON响应。 –
{“conf_rooms”:[{“id”:“1”,“conf_room_name”:“Tadoba”},{“id”:“2”,“conf_room_name”:“Melghat”},{“id”:“3 “ ”conf_room_name“: ”伦滕博尔“},{ ”ID“: ”4“, ”conf_room_name“: ”科比特“},{ ”ID“: ”5“, ”conf_room_name“: ”Pench“}],” 区域“:[{” ID “:” 1" , “面积”: “马法特拉尔”},{ “ID”: “2”, “面积”: “安泰”}], “类型”:[{ “ID”: “1”,“type”:“Is Personal”},{“id”:“2”,“type”:“Meeting”}]} –
你似乎试图解析三种不同类型的数据:会议室,地区(可能包含会议室s?)和关于任何一个的一些信息(虽然目前还不清楚)。因此,尝试将它们存储在单个数组中是没有意义的,因为每个元素包含与其他两个数据结构相比不同的数据结构。
如果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
)。
是的,所有这三件事情,即area,type和conf_rooms是不相关的,所以我应该为它们中的每一个做不同的数组,并为每个数组做不同的网络调用,或者我应该把它们放在相同的位置数组并将它们解析为单个网络调用? –
如果它们完全不相关,请考虑为什么您尝试使用单个网络调用来获取它们,如果有充分的理由(如高网络延迟,实例),你可以像@Tran Hieu建议的那样将它们全部放在一个对象中。如果它们可以完全分开处理,则将它们分开。 – AJR
您需要使用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();
}
}
我在使用你的方法后出错。这是logcat。 –
06-13 16:12:17.115 2203-2203/com.example.gandhjee.pantry_order E/AndroidRuntime:致命例外:main 进程:com.example.gandhjee.pantry_order,PID:2203 java.lang.RuntimeException:Unable开始活动ComponentInfo {com.example.gandhjee.pantry_order/com.example.gandhjee.pantry_order.fterLogin}:java.lang.IndexOutOfBoundsException:索引0无效,大小为0 –
尝试调试它,检查它是否进入循环。 –
添加您的json数据而不是图像 –
还要添加您正在使用的代码来解析您使用的数据和java pojo。 –
这样好吗?你还需要logcat数据吗? @shamimreza –