Удалить все вхождения \ из строки

Я пытаюсь получить массив объектов с сервера, используя JSON.

Сервер отправляет мне следующую строку.

"[{\"DealComment\":null,\"DealVotes\":[],\"DealId\":1,\"CompanyId\":1,\"StartDate\":\"2012-12-13T00:00:00\",\"EndDate\":\"2012-12-16T00:00:00\",\"CouponCode\":\"Test Coupon 1\",\"Description\":\"Test Deal Description 1\",\"VoteUp\":null,\"VoteDown\":null,\"ViewCount\":null,\"Title\":\"Test Deal 1\"},{\"DealComment\":null,\"DealVotes\":[],\"DealId\":2,\"CompanyId\":1,\"StartDate\":\"2012-12-16T00:00:00\",\"EndDate\":\"2012-12-17T00:00:00\",\"CouponCode\":\"Test Coupon 2\",\"Description\":\"Test Description 2\",\"VoteUp\":null,\"VoteDown\":null,\"ViewCount\":null,\"Title\":\"Test Deal 2\"},{\"DealComment\":null,\"DealVotes\":[],\"DealId\":3,\"CompanyId\":1,\"StartDate\":\"2012-12-14T00:00:00\",\"EndDate\":\"2012-12-15T00:00:00\",\"CouponCode\":\"Test Code 3\",\"Description\":\"Test Description 3\",\"VoteUp\":null,\"VoteDown\":null,\"ViewCount\":null,\"Title\":\"Test Deal 3\"},{\"DealComment\":null,\"DealVotes\":[],\"DealId\":4,\"CompanyId\":1,\"StartDate\":\"2012-12-12T00:00:00\",\"EndDate\":\"2012-12-13T00:00:00\",\"CouponCode\":\"Test Coupon 4\",\"Description\":\"Test Description 4\",\"VoteUp\":null,\"VoteDown\":null,\"ViewCount\":null,\"Title\":\"Test Deal 4\"},{\"DealComment\":null,\"DealVotes\":[],\"DealId\":5,\"CompanyId\":2,\"StartDate\":\"2012-12-12T00:00:00\",\"EndDate\":\"2012-12-14T00:00:00\",\"CouponCode\":\"AwD\",\"Description\":\"Very awesome deal!\",\"VoteUp\":null,\"VoteDown\":null,\"ViewCount\":null,\"Title\":\"Awesome Deal 1\"}]"

Теперь, если вы внимательно посмотрите на строку, вы заметите, что она содержит \" вместо каждого ", Строка не может быть отформатирована в JSONArray прямо сейчас. Итак, мне нужно заменить каждое вхождение \" с ", которая была бы довольно легкой задачей, имела \ не было побег последовательности.

Я попытался использовать следующий код.

String jsonFormattedString = jsonStr.replaceAll("\\", "");

Но это дает мне следующее исключение.

12-19 00:35:59.575: W/System.err(444): java.util.regex.PatternSyntaxException: Syntax error U_REGEX_BAD_ESCAPE_SEQUENCE near index 1:
12-19 00:35:59.575: W/System.err(444): \
12-19 00:35:59.575: W/System.err(444):  ^

Весь мой код, на случай, если он пригодится:

public void getAllDealsFromServerJson()
    {

        String apiUrl = "http://passme.azurewebsites.net/api/TestApi/";


        HttpClient client = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
        HttpResponse response;
        JSONObject json = new JSONObject();

        try{
            HttpPost httpPost = new HttpPost(apiUrl);
            json.put("requestType", "getalldeals" );

            StringEntity se = new StringEntity( json.toString());  
            se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
            httpPost.setEntity(se);
            response = client.execute(httpPost);
            Log.d("Http Response:", response.toString());
            jsonResponse = response.toString();

            BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
            String jsonStr = reader.readLine();
            Log.d("String Response", jsonStr);
            String jsonFormattedString = jsonStr.replaceAll("\\", ""); // gives error
            Log.d("Formatted String", jsonFormattedString);
            //JSONTokener tokener = new JSONTokener(jsonFormattedString);
            /*JSONObject finalResult = new JSONObject(tokener);
            Log.d("JSON Response", "" + finalResult.optString("Title"));*/
            JSONArray resultArray = new JSONArray(jsonFormattedString);
            Log.d("JSON Array Result Length", "" + resultArray.length());
            Log.d("JSON Array Result ", "" + resultArray.getJSONObject(0).optInt("DealId"));

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }



    }

6 ответов

Решение

Попробуй это:

String jsonFormattedString = jsonStr.replaceAll("\\\\", "");

Потому что обратный слеш - это экранирующий символ в регулярном выражении (replaceAll() получает в качестве параметра), его тоже нужно экранировать.

На самом деле правильный путь будет:

String jsonFormattedString = jsonStr.replace("\\\"", "\"");

Вы хотите заменить только \" с ", не все \ ни с чем (это съело бы ваши косые черты в последовательностях json, если они есть). Вопреки распространенному мнению replace(...) также заменяет все вхождения данной строки, как replaceAll(...), он просто не использует регулярные выражения, поэтому он обычно будет быстрее.

Просто используйте:

try {
        jsonFormattedString = new JSONTokener(jsonString).nextValue().toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }

Смотрите документацию

Похоже, что ваша входящая строка дважды JSON-кодируется. Вы должны расшифровать это, затем расшифровать это снова.

Вот мое лучшее предположение о том, как вы можете сделать это в Java:

JSONArray resultArray = new JSONArray(new JSONString(jsonFormattedString));

Я предполагаю, что здесь JSONString это тип. Ваше реальное решение может отличаться.

При нормальных обстоятельствах я бы ожидал, что сервис предоставит вам JSON. Похоже, что эти сервисы предоставляют вам строку (закодированную в соответствии со спецификацией JSON), которая содержит JSON.

Это разница между следующим:

String someJSON = "[0, 1, 2]";
String doublyEncodedJSON = "\"[0, 1, 2]\"";

Обратите внимание на дополнительные ведущие и конечные кавычки? Это потому, что последний является строкой JSON. Вы должны были бы расшифровать это дважды, чтобы получить фактический объект.

Вы можете просто использовать:

str.replace("\\","");

replace принимает строку в качестве параметра, replaceAll использует RegEx. это может работать так же:

str.replaceAll("\\\\", "");
jsonObj.toString()
        .replace("\"[", "[").replace("]\"", "]")
        .replace("\\\"{", "{").replace("}\\\"", "}")
        .replace("\\\\\\\"", "\"")
Другие вопросы по тегам