it-swarm.com.de

Entfernen Sie alle Vorkommen von\aus dem String

Ich versuche, ein Array von Objekten mit JSON vom Server abzurufen.

Der Server sendet mir die folgende Zeichenfolge.

"[{\"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\"}]"

Wenn Sie nun die Zeichenfolge genau betrachten, werden Sie feststellen, dass sie anstelle von jedem\"einen"enthält. Die Zeichenfolge kann momentan nicht als JSONArray formatiert werden. Also muss ich jedes Vorkommen von\"durch"ersetzen, was eine ziemlich einfache Aufgabe hätte, wenn\keine Escape-Sequenz gewesen wäre.

Ich habe versucht, den folgenden Code zu verwenden.

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

Aber es gibt mir die folgende Ausnahme.

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):  ^

Mein ganzer Code, falls er von Nutzen ist:

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



    }
19
Swayam

Versuche dies:

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

Da der Backslash das Escape-Zeichen in einem regulären Ausdruck ist (replaceAll() erhält einen als Parameter), muss er auch mit Escapezeichen versehen werden. 

27
Óscar López

Eigentlich wäre der richtige Weg:

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

Sie möchten nur \" durch " ersetzen, nicht alle \ durch nichts (es würde Ihre Schrägstriche in JSON-Zeichenfolgen auffressen, wenn Sie solche haben). Im Gegensatz zur landläufigen Meinung ersetzt replace(...) auch alle Vorkommen eines bestimmten Strings, genau wie replaceAll(...), es wird jedoch kein regulärer Ausdruck verwendet, sodass es normalerweise schneller ist.

13

Es sieht so aus, als wäre Ihre eingehende Zeichenfolge doppelt JSON-codiert. Sie sollten es dekodieren, dann wieder dekodieren.

Hier ist meine beste Vermutung, wie Sie das in Java machen könnten:

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

Ich gehe hier davon aus, dass JSONString ein Typ ist. Ihre tatsächliche Lösung kann variieren.

Unter normalen Umständen würde ich erwarten, dass ein Service Ihnen JSON direkt bietet. Es scheint, dass diese Dienste Ihnen eine Zeichenfolge (gemäß der JSON-Spezifikation) geben, die enthält JSON.

Es ist der Unterschied zwischen den folgenden:

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

Beachten Sie die zusätzlichen führenden und nachgestellten Zitate? Dies ist darauf zurückzuführen, dass das letztere eine Zeichenfolge von JSON ist. Sie müssten es zweimal entschlüsseln, um das eigentliche Objekt zu erhalten.

5
jimbojw

Benutz einfach:

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

Siehe Dokumentation 

3
Alex Kucherenko

Sie können einfach verwenden:

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

replace nimmt den String als Parameter auf, replaceAll verwendet RegEx. es kann auch so funktionieren:

str.replaceAll("\\\\", "");
3
d.raev
jsonObj.toString()
        .replace("\"[", "[").replace("]\"", "]")
        .replace("\\\"{", "{").replace("}\\\"", "}")
        .replace("\\\\\\\"", "\"")