Senden und Analysieren von JSON-Objekten in Android [geschlossen]


137

Ich möchte Nachrichten in Form von JSON-Objekten an einen Server senden und die JSON-Antwort vom Server analysieren.

Beispiel eines JSON-Objekts

{
  "post": {
    "username": "John Doe",
    "message": "test message",
    "image": "image url",
    "time":  "current time"
  }
}

Ich versuche, den JSON manuell zu analysieren, indem ich Attribut für Attribut gehe. Gibt es eine Bibliothek / ein Dienstprogramm, mit dem ich diesen Prozess vereinfachen kann?


2
Diese URL ist nicht mehr verfügbar ... können Sie sie aktualisieren?
Cipi

1
Hier ist ein detailliertes Beispiel: Android - JSON Parsing Beispiel
Paresh Mayani

1
@ Paresh Mayani & @ primpap .. Ich weiß, dass wir Daten vom Server mit JSON füllen können, das mit der Methode get vom Server empfangen wurde . Ich bin damit einverstanden . Aber wenn wir die Post-Methode verwenden, um die Daten an den Server zu senden, tun Sie dies Wenn wir die Daten erneut als JSON senden, beziehe ich mich auf Zitat der primpap-Frage "Ich möchte Nachrichten in Form von JSON-Objekten an einen Django-Server senden" ..... Ich verwende MySQL auf dem Server .... oder Ich sende JSON-Objekt? ... können Sie mir diese Informationen
erklären

Antworten:


118

Ich bin überrascht, dass diese nicht erwähnt wurden: Aber anstatt mit dem kleinen Paket von json.org einen manuellen Prozess zu verwenden, sind GSon und Jackson viel bequemer zu bedienen. So:

Sie können also tatsächlich an Ihre eigenen POJOs binden, nicht an einige halbherzige Baumknoten oder Listen und Karten. (und zumindest erlaubt Jackson auch das Binden an solche Dinge (vielleicht auch GSON, nicht sicher), JsonNode, Map, List, wenn Sie diese wirklich anstelle von "echten" Objekten wollen)

EDIT 19-MAR-2014:

Ein weiterer neuer Anwärter ist die Jackson jr- Bibliothek: Sie verwendet den gleichen schnellen Streaming-Parser / Generator wie Jackson ( jackson-core), aber der Datenbindungsteil ist winzig (50 KB). Die Funktionalität ist eingeschränkter (keine Anmerkungen, nur reguläre Java-Beans), aber die Leistung sollte schnell sein und der Initialisierungsaufwand (erster Aufruf) ist ebenfalls sehr gering. Daher ist es möglicherweise eine gute Wahl, insbesondere für kleinere Apps.


10
+1 für GSON. Wir haben in unseren Android-Apps insbesondere die Streaming-Support- Sites von GSON.google.com/site/gson/streaming verwendet .
Andre Steingress

FWIW, Jackson hat auch Streaming-API: wiki.fasterxml.com/JacksonStreamingApi
StaxMan

2
Auch +1 für GSON-Streaming. Zunächst wurde das Jackson-Streaming implementiert, aber obwohl es in der Debug-Version funktionsfähig ist, hat ProGuard unzählige Fehler generiert und die Release-Version verursacht Abstürze, die schwer zu finden sind. Ich bin mir sicher, dass dies kein Problem im Zusammenhang mit Jackson ist, aber ich bin zu GSON gewechselt, was gut funktioniert hat und nur zusätzliche 14 KB für das reine Streaming erforderlich gemacht hat.
Sven

Und für dumme unpredicatble json Mixing String und Listen ex: ["toto", "tata", ["monty", ["tor", "python"]]? (Art der Datenstruktur, für deren Verwendung rekursive Funktionen erforderlich sind)
christophe31

85

Sie können org.json.JSONObject und org.json.JSONTokener verwenden . Sie benötigen keine externen Bibliotheken, da diese Klassen mit Android SDK geliefert werden


Hoppla! Das habe ich vermisst. Tatsächlich sind dies die org.json-Bibliotheken auf der Website.
Gaurav Vaish

Dies ist, was ich benutze, und es funktioniert wie ein Zauber.
Adam

Es wäre großartig, wenn ein Beispiel oder ein Link dazu gegeben werden könnte. Es ist einfacher, so zu lernen. :)
Primal Pappachan


1
Viel mehr Komfort, weniger Code zum Schreiben: ein oder zwei Zeilen statt Dutzende.
StaxMan

31

GSON ist am einfachsten zu verwenden und der richtige Weg, wenn die Daten eine bestimmte Struktur haben.

Laden Sie gson herunter .

Fügen Sie es den referenzierten Bibliotheken hinzu.

package com.tut.JSON;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class SimpleJson extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String jString = "{\"username\": \"tom\", \"message\": \"roger that\"}  ";


        GsonBuilder gsonb = new GsonBuilder();
        Gson gson = gsonb.create();
        Post pst;

        try {
            pst = gson.fromJson(jString,  Post.class);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

Code für die Postklasse

package com.tut.JSON;

public class Post {

    String message;
    String time;
    String username;
    Bitmap icon;
}

4
Für das, was es wert ist, kann Code vereinfacht werden: Diese JSONObject-Konvertierung ist nicht erforderlich. Setter und Getter sind für GSon optional. kann hinzugefügt werden, wenn man will, aber nicht unbedingt notwendig.
StaxMan

4
Nur um StaxMans Kommentar zu verdeutlichen. In Ihrem Beispiel wird jString verwendet, in ein JSONObject konvertiert und dann wieder in einen String konvertiert, damit der gson ihn lesen kann. Verwenden Sie einfach pst = gson.fromJson (jString, Post.class). Ich glaube, dies wird auch die Notwendigkeit von Try-Catch beseitigen. Und wie StaxMan auch betont, fügen die Setter & Getter in der Post.class keinen Wert hinzu. Es wäre für andere hilfreich, Ihr Beispiel zu korrigieren.
Matt

Ich habe den doppelten Konvertierungsteil aus der Antwort entfernt
Uhr

4

Dies ist die JsonParser-Klasse

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }

Hinweis: DefaultHttpClient wird von SDK 23 nicht mehr unterstützt. Daher ist es ratsam, das Ziel SDK 21 mit diesem Code zu verwenden.


3

JSON hat eigentlich nichts zu bieten. Geschweifte Klammern stehen für "Objekte" (assoziative Arrays) und eckige Klammern für Arrays ohne Schlüssel (numerisch indiziert). Für die Arbeit mit Android gibt es fertige Klassen für das im SDK enthaltene (kein Download erforderlich).

Schauen Sie sich diese Klassen an: http://developer.android.com/reference/org/json/package-summary.html


Ich nehme an, Sie meinten geschweifte Klammern und keine eckigen Klammern!
Gaurav Vaish

2

Andere Antworten haben Jackson und GSON - die beliebten Add-On-JSON-Bibliotheken für Android - und json.org, das in Android enthaltene Bare-Bones-JSON-Paket, zur Kenntnis genommen.

Aber ich denke, es ist auch erwähnenswert, dass Android jetzt eine eigene JSON-API mit vollem Funktionsumfang hat.

Dies wurde in Honeycomb: API Level 11 hinzugefügt.

Dies umfasst
- android.util.JsonReader: docs und source
- android.util.JsonWriter: docs und source

Ich werde noch eine zusätzliche Überlegung hinzufügen, die mich zurück zu Jackson und GSON treibt: Ich habe es nützlich gefunden, Bibliotheken von Drittanbietern anstelle von Android * -Paketen zu verwenden, da dann der von mir geschriebene Code zwischen Client und Server geteilt werden kann. Dies ist besonders relevant für JSON, bei dem Sie möglicherweise Daten an einem Ende an JSON serialisieren möchten, um sie an das andere Ende zu senden. In solchen Anwendungsfällen hilft es, wenn Sie Java an beiden Enden verwenden, die Einführung von Android. * -Abhängigkeiten zu vermeiden.

Oder ich denke, man könnte sich den relevanten Android. * Quellcode schnappen und ihn Ihrem Serverprojekt hinzufügen, aber das habe ich nicht versucht ...



1

Sie müssen dies nur importieren

   import org.json.JSONObject;


  constructing the String that you want to send

 JSONObject param=new JSONObject();
 JSONObject post=new JSONObject();

Ich benutze zwei Objekte, weil Sie ein jsonObject in einem anderen haben können

post.put("username(here i write the key)","someusername"(here i put the value);
post.put("message","this is a sweet message");
post.put("image","http://localhost/someimage.jpg");
post.put("time":  "present time");

dann habe ich den post json so in einen anderen gesteckt

  param.put("post",post);

Dies ist die Methode, die ich benutze, um eine Anfrage zu stellen

 makeRequest(param.toString());

public JSONObject makeRequest(String param)
{
    try
    {

Einstellen der Verbindung

        urlConnection = new URL("your url");
        connection = (HttpURLConnection) urlConnection.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-type", "application/json;charset=UTF-8");
        connection.setReadTimeout(60000);
        connection.setConnectTimeout(60000);
        connection.connect();

Einstellen des Ausgangsstroms

        dataOutputStream = new DataOutputStream(connection.getOutputStream());

Ich benutze dies, um im Logcat zu sehen, was ich sende

        Log.d("OUTPUT STREAM  " ,param);
        dataOutputStream.writeBytes(param);
        dataOutputStream.flush();
        dataOutputStream.close();

        InputStream in = new BufferedInputStream(connection.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        result = new StringBuilder();
        String line;

hier wird der String konstruiert

        while ((line = reader.readLine()) != null)
        {
            result.append(line);
        }

Ich benutze dieses Protokoll, um zu sehen, was es in der Antwort kommt

         Log.d("INPUTSTREAM: ",result.toString());

Instanziieren eines JSON mit dem String, der die Serverantwort enthält

        jResponse=new JSONObject(result.toString());

    }
    catch (IOException e) {
        e.printStackTrace();
        return jResponse=null;
    } catch (JSONException e)
    {
        e.printStackTrace();
        return jResponse=null;
    }
    connection.disconnect();
    return jResponse;
}

Vielen Dank für Ihre Zeit im Voraus. Ich verwende Ihren Code zum Senden einer Base64-codierten Zeichenfolge an den Django-Server, aber wenn ich auf die Schaltfläche zum Senden an den Server klicke, stürzt die APP ab. Könnten Sie mir helfen, wie ich das angehen kann?
Noman Marwat

0

Wenn Sie nach einer schnellen JSON-Analyse in Android suchen, dann schlage ich Ihnen ein Tool vor, das frei verfügbar ist.

JSON Class Creator-Tool

Es ist kostenlos zu verwenden und erstellt Ihre All-JSON-Parsing-Klasse innerhalb von ein bis zwei Sekunden ..: D.


0

Obwohl es bereits hervorragende Antworten von Benutzern gibt, wie z. B. die Förderung der Verwendung von GSON usw., möchte ich die Verwendung von org.json vorschlagen . Es enthält die meisten GSON-Funktionen. Sie können damit auch einen JSON-String als Argument an das JSONObject übergeben und sich um die Ruhe kümmern, z. B.:

JSONObject json = new JSONObject("some random json string");

Diese Funktionalität macht es zu meinem persönlichen Favoriten.


0

Es gibt verschiedene Open Source-Bibliotheken, die Sie zum Parsen von json verwenden können.

org.json: - Wenn Sie json lesen oder schreiben möchten, können Sie diese Bibliothek verwenden. Erstellen Sie zuerst JsonObject: -

JSONObject jsonObj = new JSONObject(<jsonStr>);

Verwenden Sie nun dieses Objekt, um Ihre Werte abzurufen: -

String id = jsonObj.getString("id");

Das vollständige Beispiel finden Sie hier

Jackson-Datenbindung: - Wenn Sie Ihren JSON an eine bestimmte POJO-Klasse binden und analysieren möchten, können Sie die Jackson-Datenbindungsbibliothek verwenden. Dadurch wird Ihr JSON an die POJO-Klasse gebunden: -

ObjectMapper mapper = new ObjectMapper();
post= mapper.readValue(json, Post.class);

Das vollständige Beispiel finden Sie hier

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.