2015-01-29 18 views
20

Lösung: Es war ein Fehler auf meiner Seite.Wie bekommt OkHttp JSON String?

Der richtige Weg ist response.body(). String() andere als response.body.toString()

Im Jetty Servlet verwenden, ist die URL http://172.16.10.126:8789/test/path/jsonpage, diese URL jedes Mal Anfrage es wird

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

es zeigt sich, wenn Typ einem Browser die uRL in leider zeigt es eine Art Speicher andere Adresse als die jSON-String, wenn ich mit Okhttp anfordern.

TestActivity﹕ [email protected] 

Der Okhttp Code Im ein:

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 helpe?

+0

Es Konstruiert String-Objekt aus den Char Bytes und Zeichensatz. –

+3

@NikolaDespotoski danke! Es war mein eigener Fehler. Ich ersetzte 'response.body(). String()' zu 'response.body(). ToString()' ... – haifzhan

+2

@haifzhan Danke für die Klärung der Verwendung von response.body(). String() anstelle von Antwort. body(). toString() – user3144836

Antwort

58
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 auf Ihre Spalten hinzufügen:

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

Ich bekomme jetzt die Ausnahme: 'org.json.JSONException: Wert [email protected] vom Typ java.lang.String kann nicht in JSONObject' –

+3

sehr einfach Fehler umgewandelt werden ist es, '.string()' mit 'zu verwechseln.toString() ' – Zapnologica

+1

Sie sollten angeben, woher Sie die Objekte erhalten, wie das JSONObject. Bitte, fügen Sie auch die Importe ein. –

4

Ich hoffe, dass Sie die json Daten aus dem JSON-String erhalten verwaltet.

Nun, ich denke dies hilfreich sein wird

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, zu verhindern, dass ein NetworkOnMainThreadException bekommen

Auch die okhttp Bibliothek in Ihrer build.gradle importieren

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

5

ich sah sich auch das gleiche Problem

dieser Code

Verwendung:

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

es funktioniert definitiv

+0

Vielen Dank! Interessant, dass in der Dokumentation keine Informationen zur Methode string() vorhanden sind. Aber es funktioniert tatsächlich –

+0

Vielen Dank für diese Antwort. Das hat mir sehr geholfen! Seltsam, wie ich das nirgendwo sonst im Internet finden konnte! – apmartin1991

+0

Vielen Dank. Es ist seltsam über String(), aber es funktioniert super! –

1

Wie ich in meinem Code beobachtet. Wenn der Wert von body aus Response einmal abgerufen wird, wird er leer.

So glaube ich nach dem Abrufen einmal den Wert von Körper, wird es leer.

Vorschlag: Speichern Sie es in String, die viel Zeit verwendet werden kann.