2012-12-18 17 views
15

Próbuję uzyskać tablicę obiektów z serwera, używając JSON.Usuń wszystkie wystąpienia z ciągu znaków

Serwer wysyła do mnie poniższy ciąg.

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

Teraz, jeśli spojrzeć na ciąg ściśle, to można zauważyć, że zawiera on \" zamiast każdy ". Ciąg nie może być teraz sformatowany w JSONArray. Więc muszę zastąpić każde wystąpienie \" z ", który miałby dość łatwe zadanie, miał \ nie było sekwencja ucieczka.

Próbowałem użyć następującego kodu.

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

Ale to daje mi następujący wyjątek.

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

Mój cały kod, w przypadku gdy jest jakiegokolwiek użytku:

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



    } 

Odpowiedz

23

Spróbuj tego:

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

Ponieważ backslash jest ucieczką znak w wyrażeniu regularnym (replaceAll() odbiera jeden jako parametr), musi również zostać zmieniony.

+1

Awesome! Pracował jak urok! Dzięki za tandetę! – Swayam

+2

'String jsonFormattedString = jsonStr.replace ('\\', '');' jest łatwiejsze, ponieważ nie masz podwójnego wyjścia. Dokumenty mówią: Zwraca nowy ciąg wynikający z zamiany wszystkich wystąpień oldChar w tym ciągu na newChar. –

+1

@mikejones Jeśli zauważysz na podstawie tego pytania, to właśnie to PO początkowo robiło i nie działało. –

5

Wygląda na to, że Twój ciąg przychodzący jest podwójnie zakodowany JSON. Powinieneś go rozszyfrować, a następnie ponownie zdekodować.

Oto mój najlepszy przypuszczenie, jak można to zrobić w Javie:

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

Jestem zakładając tutaj że JSONString jest typem. Twoje rzeczywiste rozwiązanie może się różnić.

W normalnych okolicznościach oczekiwałbym usługi, która zapewni JSON prosto. Wygląda na to, że ta usługa podaje ciąg znaków (kodowany zgodnie ze specyfikacją JSON), który zawiera JSON.

Jest to różnica między:

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

Wskazówki dodatkowe początkowe i końcowe cytaty? To dlatego, że ta ostatnia jest ciągiem JSON. Będziesz musiał ją dwukrotnie odkodować, aby uzyskać rzeczywisty obiekt.

+0

I jak dokładnie to robię, proszę pana? – Swayam

+0

Dodałem moje najlepsze przypuszczenie --- Nie robię programowania Java często, ale pracuję z JSON codziennie. Powodzenia! – jimbojw

+0

Cóż, w rzeczywistości proszę pana. Właśnie zastąpiłem \ "z" i przetestowałem łańcuch wypadkowy tutaj http://www.jsoneditoronline.org/. Pojawił się prawidłowo, tak jak tego oczekiwałem. – Swayam

3

można po prostu użyć:

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

zastąpić wykonuje ciąg jako param, replaceAll wykorzystuje RegEx.może działać w ten sposób również:

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

Dziękuję za odpowiedź. Pracowałem przy pierwszej odpowiedzi. Wielkie dzięki i tak! :) – Swayam

11

Właściwie poprawny sposób byłoby:

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

Chcesz wymienić tylko \" z " nie wszystkie \ z nic (byłoby zjeść swoje ukośniki w ciągach json, jeśli je masz). Wbrew powszechnemu mniemaniu replace(...) również zastępuje wszystkie wystąpienia danego ciągu, podobnie jak replaceAll(...), po prostu nie używa regexp, więc zwykle jest szybszy.

+0

Oh. Nie wiedziałem o tym.ale czy to nie to samo, co zastąpienie \ "z"? – Swayam

+0

Dzięki za pomoc. –

+0

@Swayam Tak, jeśli założymy, że dany json nie będzie zawierał '\ 'wszędzie –

3

Wystarczy użyć:

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

Patrz dokumentacja

+0

Byłby to właściwy sposób, zamiast używać wyrażenia regularnego lub łańcucha zastępującego \\. – Soumya

0
jsonObj.toString() 
     .replace("\"[", "[").replace("]\"", "]") 
     .replace("\\\"{", "{").replace("}\\\"", "}") 
     .replace("\\\\\\\"", "\"") 
Powiązane problemy