В строке ответа JSON содержится автоматически добавленная обратная косая черта

Я звоню веб-службе, чтобы получить ответ строки JSON, и он содержит обратную косую черту, которой нет в исходной строке. Ниже приведен мой код для запроса строкового объекта JSON: {"name":"Name","id":1}

protected String doInBackground(String... uri) 
    {
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response;
        String responseString = null;
        try {
            response = httpclient.execute(new HttpGet(uri[0]));
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                responseString = out.toString();
            } else{
                //Closes the connection.
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            //TODO Handle problems..
        } catch (IOException e) {
            //TODO Handle problems..
        }
        return responseString;
    }

В пост-выполнении я просто пытаюсь разобрать эту строку ответа в JSONObject. код ниже:

protected void onPostExecute(String result) {
        super.onPostExecute(result);
        TextView t1=(TextView)findViewById(R.id.textView1);
        TextView t2=(TextView)findViewById(R.id.textView2);       

        //String s = result.replaceAll("\\", ""); //I have tried to escape backslashes also using this line.
        String name="failure";
        int id;
        try 
        {
            t1.setText(result);
            JSONObject reader = new JSONObject(result.toString()); //Exception on this line.
            //name = reader.getString("name").toString();
            //id = reader.getInt("id");             
            t2.setText(name);
        } 
        catch (Exception e) 
        {
            t2.setText(e.toString());
        }
    }

Строка ответа: "{\"name\":\"Name\",\"id\":1}" И когда я пытаюсь разобрать ее в JSONObject, выдается исключение: org Значение .json.JSONException типа "{"name":"Name","id":1}" не может быть преобразовано в объект json.


person Jahanzeb Khan    schedule 20.12.2014    source источник
comment
не уверен, в чем проблема, однако обратная косая черта не кажется проблемой. Обратная косая черта - это просто escape-символ. Даже в строке исключения правильно   -  person Panther    schedule 20.12.2014
comment
Я распечатал информацию, и она печатает обратную косую черту... если они здесь как экранированные символы, то их не следует печатать?   -  person Jahanzeb Khan    schedule 22.12.2014


Ответы (3)


Я знаю, что это старый вопрос, но я застрял с той же проблемой, с той лишь разницей, что у меня был JSONArray вместо JSONObject. Но метод, который я использовал для своей проблемы после поиска похожих вопросов в Stackoverflow, был тем, который я собираюсь изложить ниже, на случай, если кто-то придет искать ответ так же, как я наткнулся на ваш вопрос.

Прежде всего, вам нужно изучить ответ json, который вы получите. "{\"name\":\"Name\",\"id\":1}" – это строка. Вы видите " перед { и после }. Если эта строка является необработанным json, который вы получаете от своего веб-сервиса, то ваш метод выхода обратная косая черта, а затем создание JSONObject из этой строки должно было сработать Один из методов, который вы можете попробовать:

result = result.trim();
result = result.substring(1,result.length() - 1);
result = result.replace("\\","");

Затем,

JSONObject reader = new JSONObject(result);
name = reader.getString("name");
id = reader.getInt("id"); 

Мантра для этого решения заключалась в том, чтобы избавиться от этих дополнительных кавычек перед ответом json, а затем создать JSONObject из этой строки.

Что касается моей ситуации с JSONArray, решение было следующим:

Ответ Json: {"error":false,"myorderdetails":{"order_id":"26","orderjson":"[{\"Name\":\"Disprin\",\"Id\" :53,\"Количество\":1,\"Цена\":50}]"}}

JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
if (!error)
{
    JSONObject jsonObj= jObj.getJSONObject("myorderdetails");
    String s = jsonObj.getString("orderjson");
    s = s.replace("\\", "");
    JSONArray orderjson = new JSONArray(s);

    for(int i=0;i<orderjson.length();i++){
    JSONObject jsonObject=orderjson.getJSONObject(i);
    String pname = (String)jsonObject.get("Name");
    int pquantity = jsonObject.getInt("Quantity");
    double pprice = jsonObject.getDouble("Price");
}
person Kanwarbir Singh    schedule 18.04.2016

Добавление этого заголовка в запрос решило мою проблему:

"Content-Type" = "application/x-www-form-urlencoded"
person Ala Eddine Mehdi    schedule 01.09.2019

Посмотрите на свои преобразователи сообщений списка. Похоже, что ваш преобразователь Json (например, MappingJackson2HttpMessageConverter) находится перед StringMessageConverter. И json добавляет escape-символ '\' перед '"' к каждой преобразуемой строке.

person mkarasik    schedule 29.05.2019