web-dev-qa-db-fra.com

Supprimer toutes les occurrences de\de la chaîne

J'essaie d'obtenir un tableau d'objets du serveur à l'aide de JSON.

Le serveur m'envoie la chaîne suivante.

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

Maintenant, si vous regardez la chaîne de près, vous remarquerez qu'elle contient un \" au lieu de chaque ". La chaîne ne peut pas être formatée en JSONArray pour le moment. Donc, je dois remplacer chaque occurrence de \" par ", ce qui aurait été une tâche assez facile si \ n'avait pas été une séquence escape.

J'ai essayé d'utiliser le code suivant.

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

Mais cela me donne l'exception suivante.

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

Mon code entier, au cas où il serait utile:

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

Essaye ça:

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

Comme la barre oblique inverse est le caractère d'échappement dans une expression régulière (replaceAll() en reçoit un en tant que paramètre), il doit également être échappé. 

27
Óscar López

En fait, la bonne manière serait:

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

Vous voulez remplacer uniquement \" par ", pas tout \ par rien (cela réduirait vos barres obliques en chaînes json, si vous en avez) . Contrairement à la croyance populaire replace(...) remplace également toutes les occurrences d'une chaîne , tout comme replaceAll(...), il n’utilise pas d’expression régulière, il est donc généralement plus rapide.

13
Krzysztof Krasoń

Il semble que votre chaîne entrante soit doublement encodée en JSON. Vous devriez le décoder, puis le décoder à nouveau.

Voici ce que je peux faire de mieux pour savoir comment procéder en Java:

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

Je suppose ici que JSONString est un type. Votre solution réelle peut varier.

Dans des circonstances normales, je m'attendrais à ce qu'un service vous fournisse JSON directement. Il semble que ce service vous donne une chaîne (codée conformément à la spécification JSON) qui contient contient JSON.

C'est la différence entre ce qui suit:

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

Notez les citations supplémentaires en tête et en fin de texte? C'est parce que ce dernier est une chaîne de JSON. Vous devrez le décoder deux fois pour obtenir l'objet réel.

5
jimbojw

Il suffit d'utiliser:

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

Voir la documentation 

3
Alex Kucherenko

Vous pouvez simplement utiliser:

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

replace prend la chaîne en tant que param, replaceAll utilise RegEx. ça peut marcher comme ça aussi:

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