如何使用 jsonOject 解析多行
Posted
技术标签:
【中文标题】如何使用 jsonOject 解析多行【英文标题】:How to parse multiple rows with jsonOject 【发布时间】:2018-01-01 23:05:08 【问题描述】:我正在使用 php API 从 mysql 获取数据,并使用 Json_encode
将结果传递给 android,但是当我将结果填充到 android listview 时,我只得到一个第一行.
这是我在网上得到的结果:
"error":false,"user":"paid_amount":"500","parking_duration":"59min","parking_name":"asass"
"error":false,"user":"paid_amount":"100","parking_duration":"22min","parking_name":"SDSDASDAS"
php部分:
...........
$usersArr = $db->getDriverHistory($plate_no);
if ($usersArr != false)
foreach($usersArr as $key=>$user)
// use is found
$response[$key]["error"] = FALSE;
$response[$key]["user"]["paid_amount"] = $user["paid_amount"];
$response[$key]["user"]["parking_duration"] =
$user["parking_duration"];
$response[$key]["user"]["parking_name"] = $user["parking_name"];
$response = $response[$key] ;
// echo json_encode($response), "<br>";
// echo $response;
$json = json_encode($response);
echo $json,"<br>";
......
Android 代码:我需要的是获得车牌号等于某个数字但我只得到一行而不是所有行的所有结果。
private void GetParkingInfo(final String plate_no)
// Tag used to cancel the request
String tag_string_req = "req_Verfication";
progressBarList.setVisibility(View.VISIBLE);
// myList.setVisibility(View.GONE);
StringRequest strReq = new StringRequest(Request.Method.POST,
Urls.URL_driver_parking_information, new
Response.Listener<String>()
@Override
public void onResponse(String response)
Log.d(TAG, "cerfication Response: " + response.toString());
// Parsing json
for (int i = 0; i < response.length(); i++)
try
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error)
// user successfully exist in database
JSONObject user = jObj.getJSONObject("user");
String paid_amount = user.getString("paid_amount");
String parking_duration =
user.getString("parking_duration");
String parking_name = user.getString("parking_name");
HashMap<String, String> prodHashMap = new
HashMap<String, String>();
prodHashMap.put("paid_amount", paid_amount);
prodHashMap.put("parking_duration", parking_duration);
prodHashMap.put("parking_name", parking_name);
ArrayList<HashMap<String, String>> wordList;
wordList = new ArrayList<HashMap<String, String>>();
wordList.add(prodHashMap);
userList = wordList ;
ShowListData();
progressBarList.setVisibility(View.GONE);
else
// Error in login. Get the error message
// // hiding the progress bar
progressBarList.setVisibility(View.GONE);
myList.setVisibility(View.VISIBLE);
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getApplicationContext(), errorMsg,
Toast.LENGTH_LONG).show();
catch (JSONException e)
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Json error: " +
e.getMessage(), Toast.LENGTH_LONG).show();
// // hiding the progress bar
progressBarList.setVisibility(View.GONE);
myList.setVisibility(View.VISIBLE);
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
Log.e(TAG, "Verfication error Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
"response error", Toast.LENGTH_LONG).show();
// Toast.makeText(getApplicationContext(),
// error.getMessage(), Toast.LENGTH_LONG).show();
// hiding the progress bar
progressBarList.setVisibility(View.GONE);
myList.setVisibility(View.VISIBLE);
)
@Override
protected Map<String, String> getParams()
// Posting parameters to verfication url
Map<String, String> params = new HashMap<String, String>();
params.put("plate_no", plate_no);
return params;
;
// // Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq,tag_string_req);
【问题讨论】:
我正在阅读您的帖子,我看到了许多不清楚的地方以及您为什么要这样做echo $json,"<br>";
:)。好的,我也猜你的 json 数据是数组[]
,对吗?因为我只看到了两个结构相同的js对象......你需要在Android部分的循环之前解析json。最后请努力格式化您的代码:)
【参考方案1】:
你在错误的地方初始化了集合,请看下面的代码,这可能对你有帮助
ArrayList<HashMap<String, String>> wordList;
wordList = new ArrayList<HashMap<String, String>>();
for (int i = 0; i < response.length(); i++)
try
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error)
// user successfully exist in database
JSONObject user = jObj.getJSONObject("user");
String paid_amount = user.getString("paid_amount");
String parking_duration =
user.getString("parking_duration");
String parking_name = user.getString("parking_name");
HashMap<String, String> prodHashMap = new
HashMap<String, String>();
prodHashMap.put("paid_amount", paid_amount);
prodHashMap.put("parking_duration", parking_duration);
prodHashMap.put("parking_name", parking_name);
wordList.add(prodHashMap);
;
progressBarList.setVisibility(View.GONE);
userList = wordList ;
ShowListData()
【讨论】:
你的这种方式只有第一行重复到无穷大。我想我可能会在循环响应中添加 ArrayList 而不是 JsonObject【参考方案2】:您不会只获得一行,而是通过每次迭代创建一个新的 ArrayList。这样你只会得到最后一行。
ArrayList<HashMap<String, String>> wordList;
wordList = new ArrayList<HashMap<String, String>>();
您需要在 for 循环之外初始化列表。
ArrayList<HashMap<String, String>> wordList = new ArrayList<HashMap<String, String>>();
for (int i = 0; i < response.length; i++)
// add your information here
编辑::
我明白发生了什么。您正在循环字符串的长度。您需要将您的 String 响应转换为 JSONArray 并循环遍历它。这样你就可以遍历数组中的每个 JSONObject
List<HashMap<String, String>> wordList = new
ArrayList<HashMap<String,String>>();
try
JSONArray array = new JSONArray(response);
for (int i = 0; i < array.length(); i++)
JSONObject jsonObject = array.getJSONObject(i);
// get user // do rest of work
catch (JSONException e)
e.printStackTrace();
编辑 2::
这应该会让你继续前进。我还没有测试过,所以请注意任何缺少的括号。
private void GetParkingInfo(final String plate_no)
// Tag used to cancel the request
String tag_string_req = "req_Verfication";
progressBarList.setVisibility(View.VISIBLE);
// myList.setVisibility(View.GONE);
StringRequest strReq = new StringRequest(Request.Method.POST,
Urls.URL_driver_parking_information, new
Response.Listener<String>()
@Override
public void onResponse(String response)
Log.d(TAG, "cerfication Response: " + response.toString());
try
JSONArray jsonArray = new JSONArray(response);
if (jsonArray != null && !jsonArray.length() > 0)
for (int i = 0; i < jsonArray.length(); i++)
JSONObject jsonObject = jsonArray.getJSONObject(i);
if (!jsonObject.isNull("user"))
JSONObject user = jsonObject.getJSONObject("user");
String paid_amount = user.getString("paid_amount");
String parking_duration =
user.getString("parking_duration");
String parking_name = user.getString("parking_name");
HashMap<String, String> prodHashMap = new
HashMap<String, String>();
prodHashMap.put("paid_amount", paid_amount);
prodHashMap.put("parking_duration", parking_duration);
prodHashMap.put("parking_name", parking_name);
ArrayList<HashMap<String, String>> wordList;
wordList = new ArrayList<HashMap<String, String>>();
wordList.add(prodHashMap);
userList = wordList ;
ShowListData();
progressBarList.setVisibility(View.GONE);
catch (JSONException e)
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Json error: " +
e.getMessage(), Toast.LENGTH_LONG).show();
// // hiding the progress bar
progressBarList.setVisibility(View.GONE);
myList.setVisibility(View.VISIBLE);
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
Log.e(TAG, "Verfication error Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
"response error", Toast.LENGTH_LONG).show();
// Toast.makeText(getApplicationContext(),
// error.getMessage(), Toast.LENGTH_LONG).show();
// hiding the progress bar
progressBarList.setVisibility(View.GONE);
myList.setVisibility(View.VISIBLE);
)
@Override
protected Map<String, String> getParams()
// Posting parameters to verfication url
Map<String, String> params = new HashMap<String, String>();
params.put("plate_no", plate_no);
return params;
;
// // Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq,tag_string_req);
编辑 3::
if ($usersArr != false)
foreach($usersArr as $user)
$subresponse["error"] = FALSE;
$subresponse["user"]["paid_amount"] = $user["paid_amount"];
$subresponse["user"]["parking_duration"] = $user["parking_duration"];
$subresponse["user"]["parking_name"] = $user["parking_name"];
$response[] = $subresponse;
$json = json_encode($response);
我认为它应该是什么样子
if ($usersArr != false)
foreach($usersArr as $user)
$subresponse["error"] = FALSE;
$subresponse["user"]["paid_amount"] = $user["paid_amount"];
$subresponse["user"]["parking_duration"] = $user["parking_duration"];
$subresponse["user"]["parking_name"] = $user["parking_name"];
$response[] = $subresponse;
$json = json_encode($response);
【讨论】:
你的这个技巧只是第一行重复到无穷大。我想我可能会在循环响应中添加 ArrayList 而不是 JsonObject ,它可能是,但不是因为在网络上我有两行,而是当我使用你的方式或@Reena 的用户方式时,对于 android 部分,我只得到以下重复多次的第一行。我得到的行:"error":false,"user":"paid_amount":"500","parking_duration":"59min","parking_name":"asass"
这似乎不对。一定有其他事情发生。 ShowListData(); 是什么?是吗?
是将userList
数据添加到ListView的方法。没有其他事情发生,只是 JSonObject 只获得第一行并且无法跳转到下一行。其中wordList
是一个数组列表,用于解析获取到 ListView 的任何 JsonObject
我已经编辑了我的答案来解决你的问题。这里的工作存在一些问题。【参考方案3】:
此解决方案将帮助任何需要使用基于 android 输入的 where 子句从 mysql 获取数据和 volley 库的人。
处理php函数的DBHandler:
.....
public function getDriverHistory($plate_no)
$stmt = $this->conn->prepare("SELECT * from drivers_history
where drivers_history.plate_no = ?");
$stmt->bind_param("s", $plate_no);
if ($stmt->execute())
// $user = $stmt->get_result()->fetch_assoc();
// $stmt->close();
// return $user;
$result = $stmt->get_result();
$usersArr = array();
while ($user = $result->fetch_assoc())
$usersArr[] = $user;
$stmt->close();
return $usersArr;
else
return NULL;
....
GetdriverFunction.php 用来访问上面的函数:
...........
<?php
include './DbHandler.php';
$db = new DBHandler();
// json response array
$response = array("error" => FALSE);
if (isset($_POST['plate_no']))
// receiving the post params
$plate_no = $_POST['plate_no'];
$usersArr = $db->getDriverHistory($plate_no);
if ($usersArr != false)
$response["error"]= FALSE;
$response["user"] = $usersArr;
echo json_encode($response);
......
最后是 Java 部分方法来获取其中 plate_no 等于某个东西 plate_no 的所有结果:
private void GetParkingInfo(final String plate_no)
// Tag used to cancel the request
String tag_string_req = "req_Verfication";
progressBarList.setVisibility(View.VISIBLE);
// myList.setVisibility(View.GONE);
StringRequest strReq = new StringRequest(Request.Method.POST,
Urls.URL_driver_parking_information, new
Response.Listener<String>()
@Override
public void onResponse(String response)
Log.d(TAG, "cerfication Response: " + response.toString());
// Parsing json
JSONArray jsonArrayResult ;
for (int i = 0; i < response.length(); i++)
try
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error)
// user successfully exist in database
jsonArrayResult = jObj.getJSONArray("user");
for(int x=0; x<jsonArrayResult.length();x++)
JSONObject json = jsonArrayResult.getJSONObject(x);
String paid_amount = json.getString("paid_amount");
String parking_duration =
json.getString("parking_duration");
String parking_name = json.getString("parking_name");
HashMap<String, String> prodHashMap = new
HashMap<String, String>();
prodHashMap.put("paid_amount", paid_amount);
prodHashMap.put("parking_duration", parking_duration);
prodHashMap.put("parking_name", parking_name);
ArrayList<HashMap<String, String>> wordList;
wordList = new ArrayList<HashMap<String, String>>();
wordList.add(prodHashMap);
userList = wordList ;
ShowListData();
progressBarList.setVisibility(View.GONE);
else
// Error in login. Get the error message
// // hiding the progress bar
progressBarList.setVisibility(View.GONE);
myList.setVisibility(View.VISIBLE);
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getApplicationContext(), errorMsg,
Toast.LENGTH_LONG).show();
catch (JSONException e)
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Json error: " +
e.getMessage(), Toast.LENGTH_LONG).show();
// // hiding the progress bar
progressBarList.setVisibility(View.GONE);
myList.setVisibility(View.VISIBLE);
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
Log.e(TAG, "Verfication error Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
"response error", Toast.LENGTH_LONG).show();
// Toast.makeText(getApplicationContext(),
// error.getMessage(), Toast.LENGTH_LONG).show();
// hiding the progress bar
progressBarList.setVisibility(View.GONE);
myList.setVisibility(View.VISIBLE);
)
@Override
protected Map<String, String> getParams()
// Posting parameters to verfication url
Map<String, String> params = new HashMap<String, String>();
params.put("plate_no", plate_no);
return params;
;
// // Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq,tag_string_req);
【讨论】:
以上是关于如何使用 jsonOject 解析多行的主要内容,如果未能解决你的问题,请参考以下文章