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

标签 java android json web-services

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

这是我的代码:

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();
    }

我的网络服务返回以下格式的数据:

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 和 XML 并不是一个好主意。

但是,作为快速解决方案,您可以尝试 split使用 [<,>] 接收到的字符串作为正则表达式字符串,并查看所需的 JSON 字符串在哪个索引处,然后使用它。

类似于:

...
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 ,获取字符串内容,并将其用作JSONstring。

关于java - JSONException : Value <? java.lang.String 类型的 xml 无法转换为 JSONObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45103225/

相关文章:

java - 检查投影到线段上的点是否不在线段之外

java - 是否可以根据 @Autowire 的路径变量来决定使用哪个 bean?

javascript - javascript中解析json数据时出错

android - 如何将数据类解析为 Kotlin 的 JSON 字符串?

java - Thread.sleep()的CPU消耗

java - 为什么 this() 和 super() 必须是构造函数中的第一条语句?

android - 在 xml 中并排显示 DatePicker 和 TimePicker

android - sqlite 中具有 auto_increment 的唯一列

android - FirebaseApp 名称 [DEFAULT] 已存在

android - 在线存储数据 ANDROID