从字符串中删除所有出现的\

我试图从服务器获取一个对象数组,使用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。 因此,我需要更换每次出现的\" with " ,这将是一项非常简单的任务,而不是一个转义序列

我尝试使用以下代码。

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

尝试这个:

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

因为反斜杠是正则表达式中的转义字符( replaceAll()接收一个作为参数),所以它也必须被转义。

实际上正确的方法是:

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

你想只替换\" with " ,而不是所有\ 都没有 (如果你有的话,它会占用json字符串中的斜线)。 与流行的相反,相信replace(...)也会替换所有出现的给定字符串,就像replaceAll(...) ,它只是不使用正则表达式,所以它通常更快。

看起来你的传入字符串是双重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将string作为param,replaceAll使用RegEx。 它也可能像这样工作:

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

只需使用:

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

见文档

 jsonObj.toString() .replace("\"[", "[").replace("]\"", "]") .replace("\\\"{", "{").replace("}\\\"", "}") .replace("\\\\\\\"", "\"")