从字符串删除\\的所有出现(Remove all occurrences of \\ from st

2019-07-05 16:52发布

我试图从服务器获取对象的数组,使用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();
    }
}

Answer 1:

试试这个:

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

由于反斜杠是在正则表达式(逸出的字符replaceAll()接收一个作为参数),它必须被转义,太。



Answer 2:

其实,正确的方法是:

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

你想只替换\"" ,不是所有的\什么 (它会吃了你的斜线以JSON字符串,如果你的)。 与普遍认为replace(...)也取代定字符串的所有出现,就像replaceAll(...)它只是不使用正则表达式因此通常会更快。



Answer 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字符串。 你不得不两次进行解码,以获得实际的对象。



Answer 4:

你可以使用:

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

需要替换字符串作为PARAM,使用的replaceAll正则表达式。 它可能像这样工作也:

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


Answer 5:

只需使用:

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

见文档



Answer 6:

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


文章来源: Remove all occurrences of \\ from string