【问题标题】:How to get json Array not html from URL in android如何从android中的URL获取json数组而不是html
【发布时间】:2021-05-01 22:31:40
【问题描述】:

我正在尝试使用 volley 从 android 中的 url 获取 json 数组,但它显示以下错误

com.android.volley.ParseError: org.json.JSONException: java.lang.String 类型的值无法转换为 JSONArray

这意味着我正在从 url 接收 html。

如何从 url 接收 json 格式的数据,以便在 android 中使用 jsonObject 或 jsonArray 进行解析

我的安卓代码是

 RequestQueue queue = Volley.newRequestQueue(getContext());

 JsonArrayRequest  request = new JsonArrayRequest(Method.GET, URL,null, new Response.Listener<JSONArray>() {


     @Override
     public void onResponse(JSONArray response ) {


         Toast.makeText(getContext(), response, Toast.LENGTH_SHORT).show();

         Log.i("My success",""+response.toString());
            try {
                    for (int i = 0; i <= response.length(); i++) {
                    JSONObject silver_rate_values = response.getJSONObject(i);
                    String Silver_Rate = silver_rate_values.getString("silver_rate");
                    Log.v("SilverRate", "silverRate value is" + Silver_Rate);
                }
            }catch (JSONException e) {
                     e.printStackTrace();
                     Log.e("Silver rate", "Json parsing error: " + e.getMessage());
                 }

            }

     }, new Response.ErrorListener() {

     @Override

     public void onErrorResponse(VolleyError error) {


         Toast.makeText(getContext(), "my error :"+error, Toast.LENGTH_LONG).show();

         Log.i("My error",""+error);

     }

 }){


 };



我的php代码是

    $sql = "SELECT * FROM `user_info`  \n"

. "ORDER BY `customer_info`.`updatedTime`  DESC LIMIT 1";


   $result = mysqli_query(  $con,$sql );


   if(! $result ) {
       
   die('Could not get data: ' . mysql_error());

     }



   //print values to screen
   $data = array();
   while ($row = mysqli_fetch_assoc($result)) {
   $a = $row['a'];
   $b = $row['b'];
   $c =  $row['c'];
   $data[] = $row;


    }
   header('Content-type: application/json');
  

   $json=json_encode(array("Values" => $data));

   echo $json;

   ?>
</body>
我的 php 输出是
    <html>
    <head>
    <meta charset="UTF-8">
    <title></title>
    </head>
    <body>
    {"Values":[{"a":"8888","b":"9999","c"7777"}]}   </body>
    </html>

如果我从 php 代码中删除标头,则输出为 {"值":[{"a":"8888","b":"9999","c"7777"}]}

然后我也从 Android 端收到同样的错误

【问题讨论】:

  • 从响应 JSON 的页面中删除所有 HTML。
  • 您的 php 输出包含 html 标签。它只能包含 JSON 格式的数据。
  • @Mrudul...我也试过了..但仍然是同样的错误..

标签: php android json android-volley


【解决方案1】:

只需添加此行即可获得结果

$jsonfinal = json_encode(json_decode($json), JSON_PRETTY_PRINT);
       echo $jsonfinal ;

【讨论】:

  • 它最终会给出相同的结果...它有什么用
  • 是的,它会给出相同的结果。我意识到这个问题是在询问如何将关联数组编码为格式精美的 JSON 字符串,所以这不能直接回答这个问题,但如果你有一个已经是 JSON 格式的字符串,你可以很简单地通过解码和重新编码它(需要 PHP >= 5.4):
  • 问题不打算将关联数组编码为格式精美的 JSON 字符串...该部分已完成...问题是当我将此 Json 发送到 Android 时... Android 是接收 html 数据不是 Json 一个.....正如你所看到的错误..
  • 如果您在代码中使用了漂亮的 json,它不会在 android 中返回 html 标签。如果您仍有问题,请分享您的回复。
  • 在运行上述代码时....错误监听器被调用..没有响应(提到错误)
【解决方案2】:

现在我正在更改我的代码并使用 StringRequest 而不是 JsonArrayRequest。下面是代码

     RequestQueue queue = Volley.newRequestQueue(getContext());

 StringRequest  request = new StringRequest(Method.GET, URL_Silver, new Response.Listener<String>() {


     @Override
     public void onResponse(String response ) {


          Log.i("My success",""+response);
            try {
                
                JSONObject obj = new JSONObject(response);
                JSONArray array = obj.getJSONArray("silverRateValues");

                for (int i = 0; i <= array.length(); i++) {
                    JSONObject silver_rate_values = array.getJSONObject(i);
                    String Silver_Rate = silver_rate_values.getString("silver_rate");
                    Log.v("SilverRate", "silverRate value is" + Silver_Rate);
                }
            }catch (JSONException e) {
                     e.printStackTrace();
                     Log.e("Silver rate", "Json parsing error: " + e.getMessage());
                 }

            }

     }, new Response.ErrorListener() {

     @Override

     public void onErrorResponse(VolleyError error) {


         Toast.makeText(getContext(), "my error :"+error, Toast.LENGTH_LONG).show();

         Log.i("My error",""+error);

     }

 }){


 };


 queue.add(request);

但仍然出现相同的错误...但是现在调用响应并且它是...

    <html>
    <head>
    <meta charset="UTF-8">
    <title></title>
    </head>
    <body>
    {"Values":[{"a":"8888","b":"9999","c":"7777"}]} </body>
    </html>

错误是

org.json.JSONException:java.lang.String 类型的值无法转换为 JSONObject

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 2015-12-01
    • 2020-03-01
    • 2021-10-26
    • 1970-01-01
    • 2016-10-28
    • 2015-06-20
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多