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对象的响应转换?这是在浪费我宝贵的时间,而不是继续前进。我被困在这里。
请任何想法或建议!
在此先感谢..
你的回应不是JSON,或更好的,是无效的JSON。看到更多关于json的信息。 JSON syntax
是的,它的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字符串。
您只需要将xml标记从响应的结尾处关闭即可。然后解码内部。 –
如何获得响应后可以使用trim字符串方法吗? –
曾经有过将XML与JSON混合的“精彩”想法应该告诉你,在将有效内容传递给JSON解析器之前,您首先需要解析XML文档(使用XPATH或类似语言)。把我的问候寄给那个“互联网时代的英雄”。 –