2013-08-12 16 views
67

Pracuję nad aplikacją na Androida. W mojej aplikacji muszę przekonwertować ciąg znaków na obiekt Json, a następnie przeanalizować wartości. I sprawdzone rozwiązania w stackoverflow i stwierdzono podobny problem tutaj linkkonwersja z ciągu znaków na obiekt json android

Rozwiązaniem jest jak ten

 `{"phonetype":"N95","cat":"WP"}` 
     JSONObject jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}"); 

używam w ten sam sposób w moim kodzie. Mój ciąg jest

{"ApiInfo":{"description":"userDetails","status":"success"},"userDetails":{"Name":"somename","userName":"value"},"pendingPushDetails":[]} 

string mystring= mystring.replace("\"", "\\\""); 

A przecież zastąpić Dostałem wynik jak ten

{\"ApiInfo\":{\"description\":\"userDetails\",\"status\":\"success\"},\"userDetails\":{\"Name\":\"Sarath Babu\",\"userName\":\"sarath.babu.sarath babu\",\"Token\":\"ZIhvXsZlKCNL6Xj9OPIOOz3FlGta9g\",\"userId\":\"118\"},\"pendingPushDetails\":[]} 

kiedy wykonać JSONObject jsonObj = new JSONObject(mybizData);

otrzymuję poniższy wyjątek json

org.json.JSONException: Expected literal value at character 1 of 

Proszę o pomoc mi rozwiązać mój problem.

+0

Domyślam się, że obrażająca postać jest odwróconym ukośnikiem z powodu zamiany. Dlaczego dokładnie to robisz? Skąd pochodzi ciąg JSON? – tiguchi

+0

Otrzymuję ciąg od html..nie jako json – sarath

+1

Po prostu usuń mystring = mystring.replace ("\" "," \\\ ""); i sprawdź, czy to działa dla Ciebie. – tiguchi

Odpowiedz

156

Wyjąć ukośniki:

String json = {"phonetype":"N95","cat":"WP"}; 

try { 

    JSONObject obj = new JSONObject(json); 

    Log.d("My App", obj.toString()); 

} catch (Throwable t) { 
    Log.e("My App", "Could not parse malformed JSON: \"" + json + "\""); 
} 
+1

co jeśli łańcuch jest tablicą obiektów JSON? Podobnie jak "[{}, {}, {}]" –

+3

@FranciscoCorralesMorales możesz użyć 'JSONArray obj = new JSONArray (json);'. Następnie możesz użyć * pętli for * do iteracji po tablicy. – Phil

+0

ok, ale co jeśli JSON może być tablicą lub pojedynczym obiektem? JSONArray tego nie robi. –

7

spróbuj tego:

String json = "{'phonetype':'N95','cat':'WP'}"; 
+2

co jeśli łańcuch jest tablicą obiektów JSON? Podobnie jak "[{}, {}, {}]" –

+0

To jest dobry pomysł. Pojedynczy cytat działa i eliminuje potrzebę znaków ucieczki. –

0

Oto kod, można zdecydować, które używać
(zsynchronizowane) StringBuffer lub StringBuilder szybciej.

Benchmark pokazuje, że StringBuilder jest szybszy.

public class Main { 
      int times = 777; 
      long t; 

      { 
       StringBuffer sb = new StringBuffer(); 
       t = System.currentTimeMillis(); 
       for (int i = times; i --> 0 ;) { 
        sb.append(""); 
        getJSONFromStringBuffer(String stringJSON); 
       } 
       System.out.println(System.currentTimeMillis() - t); 
      } 

      { 
       StringBuilder sb = new StringBuilder(); 
       t = System.currentTimeMillis(); 
       for (int i = times; i --> 0 ;) { 
        getJSONFromStringBUilder(String stringJSON); 
        sb.append(""); 
       } 
       System.out.println(System.currentTimeMillis() - t); 
      } 
      private String getJSONFromStringBUilder(String stringJSONArray) throws JSONException { 
       return new StringBuffer(
         new JSONArray(stringJSONArray).getJSONObject(0).getString("phonetype")) 
          .append(" ") 
          .append(
         new JSONArray(employeeID).getJSONObject(0).getString("cat")) 
         .toString(); 
      } 
      private String getJSONFromStringBuffer(String stringJSONArray) throws JSONException { 
       return new StringBuffer(
         new JSONArray(stringJSONArray).getJSONObject(0).getString("phonetype")) 
          .append(" ") 
          .append(
         new JSONArray(employeeID).getJSONObject(0).getString("cat")) 
         .toString(); 
      } 
     } 
10

jego praca

String json = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}"; 

    try { 

     JSONObject obj = new JSONObject(json); 

     Log.d("My App", obj.toString()); 
     Log.d("phonetype value ", obj.getString("phonetype")); 

    } catch (Throwable tx) { 
     Log.e("My App", "Could not parse malformed JSON: \"" + json + "\""); 
    } 
+1

Chociaż to odpowiada na pytanie, nie wyjaśnia, dlaczego i jak to działa. Dodaj takie wyjaśnienie. – SZenC

4

Aby uzyskać JSONObject lub JSONArray z ciągiem Utworzyłem tę klasę:

public static class JSON { 

    public Object obj = null; 
    public boolean isJsonArray = false; 

    JSON(Object obj, boolean isJsonArray){ 
     this.obj = obj; 
     this.isJsonArray = isJsonArray; 
    } 
} 

tutaj, aby uzyskać JSON:

public static JSON fromStringToJSON(String jsonString){ 

    boolean isJsonArray = false; 
    Object obj = null; 

    try { 
     JSONArray jsonArray = new JSONArray(jsonString); 
     Log.d("JSON", jsonArray.toString()); 
     obj = jsonArray; 
     isJsonArray = true; 
    } 
    catch (Throwable t) { 
     Log.e("JSON", "Malformed JSON: \"" + jsonString + "\""); 
    } 

    if (object == null) { 
     try { 
      JSONObject jsonObject = new JSONObject(jsonString); 
      Log.d("JSON", jsonObject.toString()); 
      obj = jsonObject; 
      isJsonArray = false; 
     } catch (Throwable t) { 
      Log.e("JSON", "Malformed JSON: \"" + jsonString + "\""); 
     } 
    } 

    return new JSON(obj, isJsonArray); 
} 

Przykład:

JSON json = fromStringToJSON("{\"message\":\"ciao\"}"); 
if (json.obj != null) { 

    // If the String is a JSON array 
    if (json.isJsonArray) { 
     JSONArray jsonArray = (JSONArray) json.obj; 
    } 
    // If it's a JSON object 
    else { 
     JSONObject jsonObject = (JSONObject) json.obj; 
    } 
} 
0

Może być poniżej jest lepszy.

JSONObject jsonObject=null; 
    try { 
     jsonObject=new JSONObject(); 
     jsonObject.put("phonetype","N95"); 
     jsonObject.put("cat","wp"); 
     String jsonStr=jsonObject.toString(); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    }