Wie bekommt OkHttp Json-String?

Lesezeit: 5 Minuten

Benutzeravatar von Haifeng Zhang
Haifeng Zhang

Lösung: Es war ein Fehler meinerseits.

Der richtige Weg ist Antwort.body().string() außer response.body.toString()

Ich verwende das Jetty-Servlet, die URL lautethttp://172.16.10.126:8789/test/path/jsonpagejedes Mal, wenn Sie diese URL anfordern, wird sie zurückgegeben

{"employees":[
    {"firstName":"John", "lastName":"Doe"}, 
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]}

Es wird angezeigt, wenn Sie die URL in einen Browser eingeben. Leider zeigt es eine andere Speicheradresse als die JSON-Zeichenfolge, wenn ich eine Anfrage mit stelle Okhttp.

TestActivity﹕ [email protected]

Der Okhttp-Code, den ich verwende:

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}

Kann jemand helfen?

  • Es konstruiert ein String-Objekt aus den Zeichenbytes und dem Zeichensatz.

    – Nikola Despotoski

    30. Januar 2015 um 21:07 Uhr

  • @NikolaDespotoski danke! Es war mein eigener Fehler. ich ersetzte response.body().string() zu response.body().toString()

    – Haifeng Zhang

    2. Februar 2015 um 16:37 Uhr

  • @haifzhan Danke für die Erläuterung der Verwendung von response.body().string() anstelle von response.body().toString()

    – Benutzer3144836

    16. Februar 2016 um 4:07 Uhr

Benutzeravatar von Neulingen
Neulinge

try {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
        .url(urls[0])
        .build();
    Response responses = null;

    try {
        responses = client.newCall(request).execute();
    } catch (IOException e) {
        e.printStackTrace();
    }
    String jsonData = responses.body().string();
    JSONObject Jobject = new JSONObject(jsonData);
    JSONArray Jarray = Jobject.getJSONArray("employees");

    for (int i = 0; i < Jarray.length(); i++) {
        JSONObject object     = Jarray.getJSONObject(i);
    }
}

Beispiel zum Hinzufügen zu Ihren Spalten:

JCol employees  = new employees();
colums.Setid(object.getInt("firstName"));
columnlist.add(lastName);           

  • Ich bekomme jetzt die Ausnahme: org.json.JSONException: Value [email protected] of type java.lang.String cannot be converted to JSONObject

    – Gökul NC

    18. März 2017 um 17:18 Uhr

  • sehr einfacher Fehler ist zu verwirren .string() mit ‘.toString()’

    – Zapnologica

    11. Juli 2017 um 12:42 Uhr

  • Sie sollten angeben, woher Sie die Objekte erhalten, z. B. das JSONObject. Bitte fügen Sie auch die Importe hinzu.

    – Diego Alves

    15. Januar 2018 um 16:38 Uhr

  • Ich versuche, eine einfache Anfrage mit Okhttp (3.xx) durchzuführen. Ist dies die Grundlage für eine Anfrage?

    – Rock Rock

    27. April 2018 um 6:50 Uhr

  • responses.body().string() kann nur einmal aufgerufen werden
    verwenden Sie diesen Code direkt: //String jsonData = responses.body().string(); JSONObject Jobject = new JSONObject(responses.body().string());

    – Chakib Temal

    22. Oktober 2020 um 20:05 Uhr


Benutzeravatar von Venkat Veeravalli
Venkat Veeravalli

Ich stehe auch vor dem gleichen Problem

Verwenden Sie diesen Code:

// notice string() call
String resStr = response.body().string();    
JSONObject json = new JSONObject(resStr);

es funktioniert definitiv

  • Danke vielmals! Interessant, dass es in der Dokumentation keine Informationen zur Methode string() gibt. Aber es funktioniert tatsächlich

    – Leonid Ustenko

    14. April 2016 um 10:32 Uhr


  • Vielen Dank für diese Antwort. Das hat mir sehr weitergeholfen! Seltsam, dass ich das nirgendwo sonst im Internet finden konnte!

    – apmartin1991

    17. November 2016 um 11:31 Uhr

  • Vielen Dank. Es ist seltsam mit string(), aber es funktioniert großartig!

    – Ronak Gadhia

    2. Februar 2017 um 10:49 Uhr

  • Für OKHttp3 GraphQL-Antworten, die die enthalten data und error Gegenstand, so gilt dies auch.

    – Paixole

    28. Januar 2019 um 16:41 Uhr

  • Ist das Hinzufügen von toString() nicht überflüssig? Sie sollten nur response.body().string() benötigen. Das gibt String zurück.

    – Portfoliobuilder

    24. Juni 2019 um 22:46 Uhr

Benutzeravatar von Kuldip Sharma
Kuldip Sharma

Wie ich in meinem Code beobachtet habe. Wenn der Wert des Körpers aus der Antwort abgerufen wird, wird er leer.

String str = response.body().string();  // {response:[]}

String str1  = response.body().string();  // BLANK

Ich glaube also, nachdem der Wert einmal aus dem Körper abgerufen wurde, wird er leer.

Vorschlag: Speichern Sie es in String, der viele Male verwendet werden kann.

  • Ich danke dir sehr. Ich habe eine Weile versucht, das herauszufinden, und keine der obigen Antworten hat wirklich geholfen, weil ich zuerst den ganzen Körper protokolliert und dann versucht habe, die Zeichenfolge zu bekommen, und das war eigentlich das Problem.

    – Saad Ismail

    17. Juli 2018 um 12:47 Uhr


Benutzeravatar von Phillip Kigenyi
Philipp Kigenyi

Ich hoffe, Sie haben es geschafft, die JSON-Daten aus der JSON-Zeichenfolge zu erhalten.

Nun, ich denke, das wird hilfreich sein

try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
    .url(urls[0])
    .build();
Response responses = null;

try {
    responses = client.newCall(request).execute();
} catch (IOException e) {
    e.printStackTrace();
}   

String jsonData = responses.body().string();

JSONObject Jobject = new JSONObject(jsonData);
JSONArray Jarray = Jobject.getJSONArray("employees");

//define the strings that will temporary store the data
String fname,lname;

//get the length of the json array
int limit = Jarray.length()

//datastore array of size limit
String dataStore[] = new String[limit];

for (int i = 0; i < limit; i++) {
    JSONObject object     = Jarray.getJSONObject(i);

    fname = object.getString("firstName");
    lname = object.getString("lastName");

    Log.d("JSON DATA", fname + " ## " + lname);

    //store the data into the array
    dataStore[i] = fname + " ## " + lname;
}

//prove that the data was stored in the array      
 for (String content ; dataStore ) {
        Log.d("ARRAY CONTENT", content);
    }

Denken Sie daran, AsyncTask oder SyncAdapter(IntentService) zu verwenden, um eine NetworkOnMainThreadException zu verhindern

Importieren Sie auch die okhttp-Bibliothek in Ihre build.gradle

compile 'com.squareup.okhttp:okhttp:2.4.0'

Der folgende Code dient zum Abrufen von Daten vom Online-Server mithilfe der GET-Methode und der okHTTP-Bibliothek für Android Kotlin …

Log.e(“Haupt”,Antwort.body!!.string())

in obiger Zeile !! ist das Ding, mit dem Sie den Json aus dem Antworttext abrufen können

val client = OkHttpClient()
            val request: Request = Request.Builder()
                .get()
                .url("http://172.16.10.126:8789/test/path/jsonpage")
                .addHeader("", "")
                .addHeader("", "")
                .build()
            client.newCall(request).enqueue(object : Callback {
                override fun onFailure(call: Call, e: IOException) {
                    // Handle this
                    Log.e("Main","Try again latter!!!")
                }

                override fun onResponse(call: Call, response: Response) {
                    // Handle this
                    Log.e("Main",response.body!!.string())
                }
            })

Benutzeravatar von shoolpani dubey
shoolpani dubey

Ich möchte noch eine Beobachtung hinzufügen. Sie können die Methode .string() nur einmal aufrufen. Wenn Sie versuchen, es zweimal anzurufen, erhalten Sie eine illegale Zustandsausnahme.

1424540cookie-checkWie bekommt OkHttp Json-String?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy