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



我有一个方法,我从中使用 android 中的 http get 从网络服务获取数据。

这是我的代码:

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>

如何在安卓中将响应转换为 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格式保持不变,上述解决方案就可以工作。如果它可以更改,更好的解决方案是首先解析 XML,获取字符串内容,并将其用作 JSONstring。

你的响应不是JSON,或者更好的是,是一个无效的json。在此处查看有关 json 的更多信息。杰伦语法

相关内容

  • 没有找到相关文章

最新更新