2016-05-09 10 views
1

Ich habe verschiedene Dinge den ganzen Tag versucht, aber ich kann immer noch nicht analysieren diese JSON-Antwort. Ich habe erfolgreich eine Antwort von LinkedIn erhalten (ich weiß, weil ich es geloggt habe), und jetzt versuche ich, Werte daraus zu extrahieren, aber der Code, den ich verwende, erzeugt einen Fehler, der besagt, dass es keinen Wert von firstName gibt. Meine zweite Log-Anweisung wird nicht gedruckt. Meine erste Log-Anweisung, die Antwort, ist unten unten gedruckt. Was mache ich falsch?Parse geschachtelte JSON-Antwort von LinkedIn

Meine Klasse, wo ich die API

package org.azurespot.awesomesde; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.TextView; import com.linkedin.platform.APIHelper; import com.linkedin.platform.errors.LIApiError; import com.linkedin.platform.listeners.ApiListener; import com.linkedin.platform.listeners.ApiResponse; import org.json.JSONException; import org.json.JSONObject; public class LinkedInLoggedInActivity extends AppCompatActivity { String urlLinkedIn = "https://api.linkedin.com/v1/people/~:(id,first-name,last-name)?format=json"; JSONObject results; TextView firstName; TextView lastName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_linked_in_logged_in); firstName = (TextView)findViewById(R.id.textViewFirst); lastName = (TextView)findViewById(R.id.textViewLast); APIHelper apiHelper = APIHelper.getInstance(getApplicationContext()); apiHelper.getRequest(this, urlLinkedIn, new ApiListener() { @Override public void onApiSuccess(ApiResponse apiResponse) { // Success! Log.i("LINKEDIN RESPONSE: ", apiResponse.toString()); // 1st log try { results = new JSONObject(apiResponse.toString()); Log.i("NAME FROM LINKED IN: ", results.get("firstName").toString()); // 2nd log } catch (JSONException e) { e.printStackTrace(); } } @Override public void onApiError(LIApiError liApiError) { // Error making GET request! liApiError.printStackTrace(); } }); } // get first name public void linkedInFirst(View v){ try { firstName.setText(results.get("firstName").toString()); } catch (JSONException e) { e.printStackTrace(); } } // get last name public void linkedInLast(View v) { } } 

Fehler von Logcat

05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err: org.json.JSONException: No value for firstName 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at org.json.JSONObject.get(JSONObject.java:389) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at org.azurespot.awesomesde.LinkedInLoggedInActivity$1.onApiSuccess(LinkedInLoggedInActivity.java:42) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at com.linkedin.platform.APIHelper$1.onResponse(APIHelper.java:99) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at com.linkedin.platform.APIHelper$1.onResponse(APIHelper.java:95) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at android.os.Looper.loop(Looper.java:145) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5835) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at java.lang.reflect.Method.invoke(Method.java:372) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
05-08 18:58:38.227 18345-18345/org.azurespot.awesomesde W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

Einer meiner log Aussagen

nennen, die Antwort

05-08 18:38:45.577 7028-7028/org.azurespot.awesomesde I/LINKEDIN RESPONSE:: {"StatusCode":200,"responseData":"{\n \"firstName\": \"AFirstName\",\n \"id\": \"hZvMRB-3Yg\",\n \"lastName\": \"ALastName\"\n}","Location":""} 
+0

Bitte überprüfen Sie Ihre JSON-Objekt eng. Gibt es einen FirstName-Schlüssel auf der obersten Ebene? –

+0

@ cricket_007, tut mir leid, ich bin ziemlich neu in der Verwendung von JSON ... wo finde ich einen solchen Schlüssel? Ich habe nur die LinkedIn-Antwort, die wie eine JSON-Antwort aussieht, aber dann hat sie diesen StatusCode ... was mich ein wenig ablenkt. – Azurespot

+1

Die Antwort, die Sie erhalten, hat 2 Schlüssel, einen statusCode und responseData. Sie müssen das verschachtelte Objekt von responseData abrufen, bevor Sie auf den ersten Namen zugreifen können. –

Antwort

0

Toll, dank @ cricket_007 konnte ich nachvollziehen, wie das zu lösen ist. Ich habe eine verschachtelte JSON-Datei als Antwort, was bedeutet, dass ich zuerst die erste Stufe bekommen muss, nämlich den Schlüssel responseData, und diesen in eine andere neue JSONObject extrahiere, und dann kann ich von dort den Vor- und Nachnamen extrahieren. Hier ist die Arbeits Code snipets:

JSONObject results; 
JSONObject resultsInner; 
TextView firstName; 
TextView lastName; 

@Override 
      public void onApiSuccess(ApiResponse apiResponse) { 
       // Success! 
       Log.i("LINKEDIN RESPONSE: ", apiResponse.toString()); 

       try { 
        results = new JSONObject(apiResponse.toString()); 
        // must get the key responseData first, then will extract values from it 
        resultsInner = new JSONObject(results.getString("responseData")); 

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

...

// get first name 
    public void linkedInFirst(View v){ 
     try { 
      firstName.setText(resultsInner.getString("firstName")); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    // get last name 
    public void linkedInLast(View v) { 
     try { 
      lastName.setText(resultsInner.getString("lastName")); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    }