2012-12-18 20 views
15

Ich versuche, ein Array von Objekten vom Server mithilfe von JSON zu erhalten.Entfernen Sie alle Vorkommen von von Zeichenfolge

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

Nun, wenn Sie an der Schnur genau hinsehen, werden Sie feststellen, dass es ein \" statt jeder " enthält. Die Zeichenfolge kann momentan nicht in ein JSONArray formatiert werden. Also, ich brauche jedes Vorkommen von \" mit " zu ersetzen, was eine ziemlich einfache Aufgabe haben würde, hatte \ kein Escape-Sequenz gewesen.

Ich habe versucht, den folgenden Code 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 es irgend:

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



    } 

Antwort

23

starten:

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

Da der Backslash das entweichende Zeichen in einem regulären Ausdruck ist (replaceAll() erhält eines als Parameter), muss es auch entgangen sein.

+1

Awesome! Lief wie am Schnürchen! Vielen Dank, Sir! – Swayam

+2

'String jsonFormattedString = jsonStr.replace ('\\', '');' ist einfacher, da Sie nicht doppelt entkommen können. Docs sagen: Gibt eine neue Zeichenfolge zurück, die aus dem Ersetzen aller Vorkommen von oldChar in dieser Zeichenfolge durch newChar resultiert. –

+1

@mikejones Wenn Sie von der Frage bemerken, das war, was das OP ursprünglich tat und es nicht funktionierte. –

5

Es sieht so aus, als ob Ihre eingehende Zeichenfolge doppelt JSON-codiert ist. Sie sollten es entschlüsseln und dann wieder dekodieren.

Hier ist meine beste Vermutung, wie Sie das tun könnte, dass in Java:

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

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

Unter normalen Umständen würde ich erwarten, dass Ihnen ein Dienst JSON direkt zur Verfügung stellt. Es scheint, dass diese Dienste Ihnen eine Zeichenfolge (codiert nach der JSON-Spezifikation) geben, die JSON enthält.

Es ist der Unterschied zwischen den folgenden:

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

Beachten Sie die zusätzlichen vorderen und hinteren Anführungszeichen? Das liegt daran, dass letzteres eine Folge von JSON ist. Sie müssten es zweimal dekodieren, um das tatsächliche Objekt zu erhalten.

+0

Und wie genau mache ich das Sir? – Swayam

+0

Meine beste Schätzung hinzugefügt --- Ich mache keine Java-Entwicklung, aber ich arbeite täglich mit JSON. Viel Glück! – jimbojw

+0

Nun, eigentlich Herr .. Ich ersetzte nur die "mit" und testete die resultierende Zeichenfolge hier http://www.jsoneditoronline.org/. Es zeigte sich richtig, so wie ich es erwartet hatte. – Swayam

3

Sie können einfach verwenden:

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

ersetzen String als param nimmt, replaceAll verwendet RegEx.es kann wie diese auch funktionieren:

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

Danke für die Antwort. Ich habe es mit der ersten Antwort funktioniert. Vielen Dank trotzdem! :) – Swayam

11

Eigentlich ist der richtige Weg wäre:

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

Sie wollen alle nur ersetzen \" mit ", nicht \ mit nichts (es essen würde auf Ihre Schrägstriche in JSON-Strings, wenn Sie solche haben). Entgegen der landläufigen Meinung replace(...) ersetzt auch alle Vorkommen der gegebenen Zeichenfolge, genau wie replaceAll(...), es verwendet einfach nicht regexp, so dass es in der Regel schneller sein.

+0

Oh. war mir dessen nicht bewusst.aber ist es nicht dasselbe wie "mit" zu ersetzen? – Swayam

+0

Danke für die Hilfe. –

+0

@Swayam Ja, wenn wir annehmen, dass gegebenes json '' '' nirgends enthalten wird –

3

Verwenden Sie einfach:

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

Siehe Dokumentation

+0

Dies wäre der richtige Weg zu tun, anstelle von Regex oder String ersetzen die \\. – Soumya

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