Supprimer toutes les occurrences de \ de chaîne
Je suis d'essayer d'obtenir un tableau d'objets à partir du serveur, en utilisant JSON.
Le serveur m'envoie la chaîne de caractères 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'il contient une \"
au lieu de tous les "
. La chaîne ne peut pas être mis en forme à une JSONArray droit maintenant. Donc, j'ai besoin de remplacer chaque occurrence de \"
avec "
, ce qui aurait une jolie tâche facile, avait \
pas été un séquence d'échappement.
J'ai essayé d'utiliser le code suivant.
String jsonFormattedString = jsonStr.replaceAll("\\", "");
Mais il 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): ^
Tout mon code, dans le cas où il est de toute utilisation :
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();
}
}
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Parce que la barre oblique inverse est l'échappement de caractères dans une expression régulière (
replaceAll()
reçoit en paramètre), il a échappé, trop.String jsonFormattedString = jsonStr.replace('\\', '');
est plus facile puisque vous n'avez pas d'échappement double. Docs dire: Retourne une nouvelle chaîne résultant de remplacer toutes les occurrences de oldChar dans cette chaîne avec newChar.replaceAll(String, String)
, alors que @mikejones suggère à l'aide dereplace(char, char)
. (Malheureusement, @mikejones la solution n'aurait pas travaillé, puisqu'il n'y a pas de "vide char"''
.)En fait la façon correcte serait:
Vous souhaitez remplacer uniquement
\"
avec"
, pas tous les\
avec rien (il mange vos barres obliques dans les chaînes json, si vous en avez).Contrairement à la croyance populaire
replace(...)
également remplace toutes les occurrences de la chaîne, tout commereplaceAll(...)
, il n'a tout simplement pas utiliser regexp sorte qu'il est généralement plus rapide.Il ressemble à votre arrivée de chaîne est doublement encodé en JSON. Vous devez décoder, puis le décoder à nouveau.
Voici ma meilleure supposition quant à la façon dont vous pourriez le faire en Java:
Je suis en supposant ici que
JSONString
est un type. Votre solution réelle peut varier.Dans des circonstances normales, je m'attends à un service pour vous donner JSON vers le haut. Il apparaît que ces services est de vous donner une chaîne de caractères (codés selon la spécification JSON) qui contient JSON.
C'est la différence entre la suivante:
Avis supplémentaires attaque et de fuite des citations? C'est parce que ce dernier est une chaîne JSON. Vous auriez à décoder deux fois pour obtenir l'objet réel.
Suffit d'utiliser:
Voir la documentation
Vous pouvez simplement utiliser:
remplacer prend chaîne de caractères comme paramètre, replaceAll utilise des RegEx. il peut travailler comme ça aussi: