Konvertierung von String zu JSON-Objekt Android

107

Ich arbeite an einer Android-Anwendung. In meiner App muss ich eine Zeichenfolge in Json Object konvertieren und dann die Werte analysieren. Ich habe nach einer Lösung in Stackoverflow und fand ähnliche Frage hier Link

Die Lösung ist wie folgt

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

Ich benutze den gleichen Weg in meinem Code. Mein String ist

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

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

Und nach dem Ersetzen habe ich das Ergebnis wie folgt erhalten

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

wenn ich ausführe JSONObject jsonObj = new JSONObject(mybizData);

Ich erhalte die folgende JSON-Ausnahme

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

Bitte helfen Sie mir, mein Problem zu lösen.

Sarath
quelle
Ich denke, der beleidigende Charakter ist wegen Ihrer Substitution ein Backslash. Warum genau machst du das? Woher kommt die JSON-Zeichenfolge?
Tiguchi
Ich bekomme den String von HTML ... nicht als json
sarath
1
Entfernen Sie einfach mystring = mystring.replace ("\" "," \\\ ""); und sehen Sie, ob es dann für Sie funktioniert.
Tiguchi

Antworten:

226

Entfernen Sie die Schrägstriche:

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 + "\"");
}
Phil
quelle
4
Was ist, wenn die Zeichenfolge ein Array von JSON-Objekten ist? Wie "[{}, {}, {}]"
Francisco Corrales Morales
3
@FranciscoCorralesMorales können Sie verwenden JSONArray obj = new JSONArray(json);. Anschließend können Sie eine for-Schleife verwenden , um das Array zu durchlaufen.
Phil
2
@FranciscoCorralesMorales verwenden Sie einfach einen Try-Catch- Block. Wenn einer fehlschlägt, nehmen Sie den anderen an.
Phil
1
@ ripDaddy69 Es klingt so, als wäre JSON ungültig. Es werden Schlüssel-Wert-Paarungen erwartet, die von geschweiften Klammern umgeben sind. Versuchen Sie etwas wie {"Fat cat":"meow"}.
Phil
2
@Phil Das scheint keine gültige Java-String-Zuweisung zu sein. Ich verstehe nicht, was ich anders mache, obwohl JSONObject obj = neues JSONObject ("Fat cat": "meow"); Ich habe es herausgefunden, ich musste \ vor den Anführungszeichen verwenden und dann tatsächliche Anführungszeichen um das Ganze. Vielen Dank.
31

es ist Arbeit

    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 + "\"");
    }
Ercan ILIK
quelle
1
Dies beantwortet zwar die Frage, erklärt aber nicht, warum oder wie es funktioniert. Bitte fügen Sie eine solche Erklärung hinzu.
CerebralFart
Es scheint eine einfache Codelösung zu sein, bei der ein anderes Objekt erstellt werden muss, das die Escape-Sequenz verarbeitet.
Kelalaka
7

Versuche dies:

String json = "{'phonetype':'N95','cat':'WP'}";
user3139217
quelle
2
Was ist, wenn die Zeichenfolge ein Array von JSON-Objekten ist? Wie "[{}, {}, {}]"
Francisco Corrales Morales
Das ist eine gute Idee. Das einfache Anführungszeichen funktioniert und macht die Escape-Zeichen überflüssig.
David M Lee
1
Apostroph mag in JAVA funktionieren, aber es ist kein strenger legaler JSON. Daher müssen Sie die Dinge in anderen Sprachen oder Situationen möglicherweise anders machen.
Jesse Chisholm
4

Um ein JSONObject oder JSONArray aus einem String abzurufen, habe ich diese Klasse erstellt:

public static class JSON {

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

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

Hier, um den JSON zu erhalten:

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

Beispiel:

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;
    }
}
RiccardoCh
quelle
Sie können gerade testen Sie die ersten Buchstaben des JSON - String zu sehen , ob es ist [oder {zu wissen , ob es ein Array oder ein Objekt. Dann würden Sie nicht beide Ausnahmen riskieren, nur die relevante.
Jesse Chisholm
3

Probieren Sie es einfach aus, endlich funktioniert das für mich:

//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);
mhKarami
quelle
3

Sie benötigen nur die folgenden Codezeilen:

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

Hier ist der Code, und Sie können entscheiden, welcher
(synchronisierte) StringBuffer oder schnellere StringBuilder verwendet werden soll.

Der Benchmark zeigt, dass StringBuilder schneller ist.

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();
            }
        }
android.dk
quelle
0

Vielleicht ist unten besser.

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