konwersja z ciągu znaków na obiekt json android


107

Pracuję nad aplikacją na Androida. W mojej aplikacji muszę przekonwertować ciąg na obiekt Json, a następnie przeanalizować wartości. Sprawdziłem rozwiązanie w stackoverflow i znalazłem podobny problem tutaj link

Rozwiązanie jest takie

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

Używam tego samego w moim kodzie. Mój sznurek jest

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

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

A po wymianie uzyskałem taki wynik

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

kiedy wykonuję JSONObject jsonObj = new JSONObject(mybizData);

Otrzymuję poniższy wyjątek JSON

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

Proszę, pomóż mi rozwiązać mój problem.


Wydaje mi się, że obraźliwa postać to odwrotny ukośnik z powodu twojej zamiany. Dlaczego dokładnie to robisz? Skąd pochodzi ciąg JSON?
tiguchi

Otrzymuję ciąg z html .. nie jako json
sarath

1
Po prostu usuń mystring = mystring.replace ("\" "," \\\ ""); i zobacz, czy to zadziała.
tiguchi

Odpowiedzi:


227

Usuń 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 + "\"");
}

4
co, jeśli łańcuch jest tablicą obiektów JSON? Na przykład „[{}, {}, {}]”
Francisco Corrales Morales

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

2
@FranciscoCorralesMorales po prostu użyj bloku try-catch . Jeśli jedno zawiedzie, przyjmij drugie.
Phil

1
@ ripDaddy69 Wygląda na to, że to nieprawidłowy kod JSON. Oczekuje par klucz-wartość w nawiasach klamrowych. Spróbuj czegoś takiego {"Fat cat":"meow"}.
Phil

2
@Phil To nie wygląda na prawidłowe przypisanie ciągu java. Nie rozumiem, co robię inaczej, chociaż JSONObject obj = new JSONObject ("Gruby kot": "miau"); Rozgryzłem to, musiałem użyć \ infront cytatów, a następnie rzeczywistych cytatów wokół całej sprawy. Dzięki.

31

to jest 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 ani jak to działa. Proszę dodać takie wyjaśnienie.
CerebralFart

Wydaje się, że jest to proste rozwiązanie kodowe, które wymaga stworzenia kolejnego obiektu obsługującego sekwencję ucieczki.
kelalaka

7

Spróbuj tego:

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

2
co, jeśli łańcuch jest tablicą obiektów JSON? Na przykład „[{}, {}, {}]”
Francisco Corrales Morales

To jest dobry pomysł. Pojedynczy cudzysłów działa i eliminuje potrzebę stosowania znaków ucieczki.
david m lee

1
Apostrof może działać w JAVA, ale nie jest to ściśle prawny kod JSON. Być może będziesz musiał postąpić inaczej w innych językach lub sytuacjach.
Jesse Chisholm

4

Aby uzyskać JSONObject lub JSONArray z String, stworzył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 pobrać 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;
    }
}

Możesz po prostu przetestować pierwszy znak ciągu JSON, aby sprawdzić, czy tak jest, [lub {sprawdzić, czy jest to tablica, czy obiekt. Wtedy nie ryzykowałbyś obu wyjątków, tylko ten odpowiedni.
Jesse Chisholm

3

po prostu spróbuj tego, w końcu to działa dla mnie:

//delete backslashes ( \ ) :
            data = data.replaceAll("[\\\\]{1}[\"]{1}","\"");
//delete first and last double quotation ( " ) :
            data = data.substring(data.indexOf("{"),data.lastIndexOf("}")+1);
            JSONObject json = new JSONObject(data);

3

Potrzebujesz tylko linii kodu, jak poniżej:

 try {
        String myjsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
        JSONObject jsonObject = new JSONObject(myjsonString );
        //getting specific key values
        Log.d("phonetype = ", jsonObject.getString("phonetype"));
        Log.d("cat = ", jsonObject.getString("cat");
    }catch (Exception ex) {
         StringWriter stringWriter = new StringWriter();
         ex.printStackTrace(new PrintWriter(stringWriter));
         Log.e("exception ::: ", stringwriter.toString());
    }

0

Oto kod i możesz zdecydować, który
(zsynchronizowany) StringBuffer lub szybszy StringBuilder ma być używany.

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

0

Może niżej jest lepiej.

JSONObject jsonObject=null;
    try {
        jsonObject=new JSONObject();
        jsonObject.put("phonetype","N95");
        jsonObject.put("cat","wp");
        String jsonStr=jsonObject.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.