JSONException:值<?xml的类型java.lang.String不能转换为JSONObject

问题描述:

我有一个方法,我从中获取数据从web服务使用http获取android。JSONException:值<?xml的类型java.lang.String不能转换为JSONObject

这里是我的代码:

protected Void doInBackground(Void... arg0){ 

      HttpHandler sh = new HttpHandler(); 

      // making request to url and getting respose 
      String jsonStr = sh.makeServiceCall(url); 

      Log.e(TAG, "Response from url: " +jsonStr); 

      if (jsonStr != null){ 
       try { 
        JSONObject jsonObject = new JSONObject(jsonStr); 

        // getting json array node 
        JSONArray shipments = jsonObject.getJSONArray("string"); 

        // looping through all shipments 
        for (int i = 0; i < shipments.length(); i++){ 

         JSONObject c = shipments.getJSONObject(i); 

         String id = c.getString("ID"); 
         String controlnumber = c.getString("ControlNumber"); 
         String clientcn = c.getString("clientcn"); 
         String chargeableweight = c.getString("ChargeableWeight"); 

         // tmp hashmap for single shipmentdetail 
         HashMap<String, String> shipment = new HashMap<>(); 

         // adding each child nodeto hashmap 
         shipment.put("id", id); 
         shipment.put("controlnumber", controlnumber); 
         shipment.put("clientcn", clientcn); 
         shipment.put("chargeableweight", chargeableweight); 

         // adding shipment to shipment list 
         shipmentList.add(shipment); 
        } 
       }catch (final JSONException e){ 
        Log.e(TAG, "Json parsing error: " +e.getMessage()); 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(getApplicationContext(), 
            "Json parsing error: " +e.getMessage(), 
            Toast.LENGTH_LONG).show(); 
         } 
        }); 
       } 
      }else { 
       Log.e(TAG, "Couldn't get Json from server."); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getApplicationContext(), 
           "Couldn't get json from server. Check LogCat for possible errors!", 
           Toast.LENGTH_LONG).show(); 
        } 
       }); 
      } 
      return null; 
     } 

public String makeServiceCall(String reqUrl){ 

     String response = null; 

     try { 

      URL url = new URL(reqUrl); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.setRequestMethod("GET"); 

      //read the response 
      InputStream in = new BufferedInputStream(conn.getInputStream()); 
      response = convertStreamToString(in); 
     }catch (MalformedURLException e){ 
      Log.e(TAG, "MalformedException: " +e.getMessage()); 
     }catch (ProtocolException e){ 
      Log.e(TAG, "Protocal Exception: " +e.getMessage()); 
     }catch (IOException e){ 
      Log.e(TAG, "IOException: " +e.getMessage()); 
     }catch (Exception e){ 
      Log.e(TAG, "Exception: " +e.getMessage()); 
     } 
     return response; 
    } 

    private String convertStreamToString(InputStream is){ 

     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder sb = new StringBuilder(); 

     String line; 
     try { 
      while ((line = reader.readLine()) != null){ 

       sb.append(line).append('\n'); 
      } 
     }catch (IOException e){ 
      e.printStackTrace(); 
     }finally { 
      try { 
       is.close(); 
      }catch (IOException e){ 
       e.printStackTrace(); 
      } 
     } 
     return sb.toString(); 
    } 

我的web服务返回这个格式的数据:

Response from url: <?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">[{"ID":144412,"ControlNumber":186620,"clientcn":160054,"ChargeableWeight":1.00,"TotalPieces":1,"SpecialPickup":false,"ReadyDate":null,"CompanyName":"233/Evergreen","CompanyAddress":"582 Tuna Street","CompanyAddress1":"45288","City":"Terminal Island","State":"CA","ZipCode":"90731","ContactPhone":"","ContactName":"","C_CompanyName":"Mitoy Logistics","C_CompanyAddress":"1140 Alondra blvd","C_CompanyAddress1":"","C_City":"Compton","C_State":"CA","C_ZipCode":"90220","C_ContactPhone":"","C_ContactName":"John ","priority":5,"FreightShipment":false,"FreightDetails":"20 STD CNTR# SCLU7888484"}]</string> 

如何在android系统,以JSON对象的响应转换?这是在浪费我宝贵的时间,而不是继续前进。我被困在这里。

请任何想法或建议!

在此先感谢..

+1

您只需要将xml标记从响应的结尾处关闭即可。然后解码内部。 –

+0

如何获得响应后可以使用trim字符串方法吗? –

+2

曾经有过将XML与JSON混合的“精彩”想法应该告诉你,在将有效内容传递给JSON解析器之前,您首先需要解析XML文档(使用XPATH或类似语言)。把我的问候寄给那个“互联网时代的英雄”。 –

你的回应不是JSON,或更好的,是无效的JSON。看到更多关于json的信息。 JSON syntax

+0

是的,它的XML与JSON混合在一起,问题是如何从这个XML和JSON混合字符串中获取JSON? –

正如评论中所述,将JSON和XML混合使用并不是一个好主意。

但是,作为一个快速修复,你可以尝试split收到的字符串使用[<,>]作为正则表达式字符串,并查看哪个索引是必需的JSONstring,然后使用它。

类似:

... 
String[] stringSplit = serverResponseString.split("[<,>]"); 

//assuming the JSON is at the 4th index of the stringSplit array 
String jsonString = stringSplit[4]; 

注:在这个问题给出的例子中,将计算出合法的JSON字符串所需的部分是:[{"ID":144412 ... SCLU7888484"}]

编辑:上述解决方案将只要响应格式相对于XML格式保持不变即可工作。如果它可以更改,更好的解决方案是parse the XML first,获取字符串内容,并将其用作JSON字符串。