Удалите все вхождения\из строки
Я пытаюсь получить массив объектов с сервера, используя 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 прямо сейчас. Итак, мне нужно заменить каждое появление \"
на "
, что было бы довольно простой задачей: \
не была escape-последовательность.
Я попытался использовать следующий код.
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();
}
}
Ответы
Ответ 1
Попробуйте следующее:
String jsonFormattedString = jsonStr.replaceAll("\\\\", "");
Поскольку обратная косая черта является символом экранирования в регулярном выражении (replaceAll()
получает один параметр), он также должен быть экранирован.
Ответ 2
На самом деле правильный путь:
String jsonFormattedString = jsonStr.replace("\\\"", "\"");
Вы хотите заменить только \"
на "
, а не на все \
ничем (он будет уничтожать ваши косые черты в json-строках, если они есть).
Вопреки распространенному мнению, replace(...)
также заменяет все вхождения данной строки, так же как и replaceAll(...)
, она просто не использует regexp, поэтому обычно быстрее.
Ответ 3
Похоже, что ваша входящая строка дважды закодирована JSON. Вы должны декодировать его, а затем снова декодировать.
Вот мое лучшее предположение о том, как вы можете это сделать в Java:
JSONArray resultArray = new JSONArray(new JSONString(jsonFormattedString));
Я предполагаю, что JSONString
является типом. Ваше фактическое решение может отличаться.
В нормальных условиях я ожидаю, что служба предоставит вам JSON прямо вверх. Похоже, что эти службы предоставляют вам строку (закодированную в соответствии со спецификацией JSON), которая содержит JSON.
Это различие между следующим:
String someJSON = "[0, 1, 2]";
String doublyEncodedJSON = "\"[0, 1, 2]\"";
Обратите внимание на дополнительные ведущие и конечные кавычки? Это потому, что последнее является строкой JSON. Вам нужно будет дважды декодировать его, чтобы получить фактический объект.
Ответ 4
Вы можете просто использовать:
str.replace("\\","");
replace принимает строку как param, replaceAll использует RegEx. он может работать следующим образом:
str.replaceAll("\\\\", "");
Ответ 5
Просто используйте:
try {
jsonFormattedString = new JSONTokener(jsonString).nextValue().toString();
} catch (JSONException e) {
e.printStackTrace();
}
См. документацию
Ответ 6
jsonObj.toString()
.replace("\"[", "[").replace("]\"", "]")
.replace("\\\"{", "{").replace("}\\\"", "}")
.replace("\\\\\\\"", "\"")