如何从android中的URL获取json数组而不是html

Posted

技术标签:

【中文标题】如何从android中的URL获取json数组而不是html【英文标题】:How to get json Array not html from URL in android 【发布时间】: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...我也试过了..但仍然是同样的错误.. 【参考方案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

【讨论】:

以上是关于如何从android中的URL获取json数组而不是html的主要内容,如果未能解决你的问题,请参考以下文章

如何从android中的url获取json对象

如何从 Android 中的 JSON OR URL 获取特定数据? [关闭]

如何从android中的url解析多个JSON对象和数组?我正在使用一个示例,我希望在该示例中使用它,

如何从没有数组名称的android中的json中获取数据?

如何从 alamofire 中的 json 数组中获取对象?

如何仅将一些选定的 Json 数组和 Json 对象从 Url 解析到 android 设备