如何使用 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,"&lt;br&gt;"; :)。好的,我也猜你的 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 解析多行的主要内容,如果未能解决你的问题,请参考以下文章