【问题标题】:Remove all occurrences of \ from string从字符串中删除所有出现的 \
【发布时间】:2012-12-06 01:40:25
【问题描述】:

我正在尝试使用 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();
    }
}

【问题讨论】:

    标签: java regex string replace escaping


    【解决方案1】:

    试试这个:

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

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

    【讨论】:

    • 太棒了!像魅力一样工作!非常感谢先生!
    • String jsonFormattedString = jsonStr.replace('\\', ''); 更容易,因为您没有双重转义。文档说:返回一个新字符串,该字符串是用 newChar 替换此字符串中所有出现的 oldChar 所产生的。
    • @mikejones 如果您从问题中注意到,这就是 OP 最初在做的事情,但它没有工作。
    • @HunterMcMillen:不完全是。 OP 使用replaceAll(String, String),而@mikejones 建议使用replace(char, char)。 (不幸的是,@mikejones 的解决方案也不起作用,因为没有“空字符”''。)
    • 这可能会解决手头的问题,但可能会导致问题。在这里,我们假设反斜杠的唯一用途是为双引号添加前缀,这对于 this 示例数据可能是正确的。但根本原因是服务器对数据进行了双重 JSON 编码。如果不专门解决这个问题,您的代码有一个隐藏的错误,只有当最终结果有一个真正的反斜杠被意外剥离时才会爆炸。
    【解决方案2】:

    其实正确的做法是:

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

    您只想用" 替换\",而不是用nothing 替换所有\(如果有的话,它会占用您在json 字符串中的斜杠)。 与流行的看法相反,replace(...) 也会替换所有出现的给定字符串,就像 replaceAll(...) 一样,它只是不使用正则表达式,因此通常更快。

    【讨论】:

    • 哦。没有意识到这一点。但这与将 \" 替换为 " 不一样吗?
    • 感谢您的帮助。
    • @Swayam 是的,如果我们假设给定的 json 不会包含``任何地方
    • 感谢您的澄清。现在读到这里让我想起了四年多以前的问题。 :)
    • 如果我们想在字符串中保留\" 怎么办?它也会删除它。
    【解决方案3】:

    只需使用:

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

    查看文档

    【讨论】:

    • 这将是正确的做法,而不是使用正则表达式或字符串替换 \\.
    • 这应该是正确的答案,通过替换方法可能会在 JSON 中出现一些其他格式问题。
    • 谢谢。大家好用这个方法。
    【解决方案4】:

    看起来您的传入字符串是双重 JSON 编码的。你应该解码它,然后再解码。

    这是我对如何在 Java 中做到这一点的最佳猜测:

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

    我在这里假设JSONString 是一种类型。您的实际解决方案可能会有所不同。

    在正常情况下,我希望服务能够直接为您提供 JSON。该服务似乎为您提供了一个字符串(根据 JSON 规范编码),其中 包含 JSON。

    这就是下面的区别:

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

    注意到额外的前导和尾随引号了吗?那是因为后者是一串 JSON。您必须对其进行两次解码才能获得实际对象。

    【讨论】:

    • 先生,我该怎么做?
    • 添加了我的最佳猜测——我不经常进行 Java 开发,但我每天都使用 JSON。祝你好运!
    • 嗯,实际上先生.. 我只是用 " 替换了 \" 并在此处测试了结果字符串 jsoneditoronline.org 。它以我预期的方式正确显示。
    • 是的,我同意它适用于您当前从第三方 JSON 服务返回的特定示例数据。我在另一个答案的评论中解释了为什么这会掩盖一个隐藏的错误,当数据最终包含一个真正的反斜杠时会出现。
    • 是的,先生。我明白这一点。我将看看如何在 java 中对 JSON 进行双重解码。
    【解决方案5】:

    你可以使用:

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

    replace 将字符串作为参数,replaceAll 使用正则表达式。它也可以这样工作:

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

    【讨论】:

    • 感谢您的回答。我使用第一个答案让它工作。总之非常感谢! :)
    【解决方案6】:
    jsonObj.toString()
            .replace("\"[", "[").replace("]\"", "]")
            .replace("\\\"{", "{").replace("}\\\"", "}")
            .replace("\\\\\\\"", "\"")
    

    【讨论】:

      猜你喜欢
      • 2014-08-07
      • 2011-06-02
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多