【问题标题】:Parse nested JSON response from LinkedIn解析来自 LinkedIn 的嵌套 JSON 响应
【发布时间】:2016-09-03 13:29:18
【问题描述】:

我整天都在尝试不同的事情,但我仍然无法解析这个 JSON 响应。我成功地得到了 LinkedIn 的回复(我知道,因为我记录了它),现在我正在尝试从中提取值,但我使用的代码正在创建一个错误,指出没有 firstName 的值。我的第二个日志语句不会打印。我的第一个日志语句,即响应,打印在底部下方。我做错了什么?

我调用 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) {

    }
}

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)

我的日志语句之一,响应

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":""}

【问题讨论】:

  • 请仔细检查您的 JSON 对象。顶层有 firstName 键吗?
  • @cricket_007,对不起,我对使用 JSON 很陌生……我在哪里可以找到这样的密钥?我只有一个看起来像 JSON 响应的 LinkedIn 响应,但它有那个 StatusCode... 这让我有点失望。
  • 你得到的响应有 2 个键,一个 statusCode 和 responseData。您需要先获取 responseData 的嵌套对象,然后才能访问 firstName
  • How to parse JSON in Java的可能重复
  • 欢迎您! Gson/Jackson 是非常有用的库,可以在 Java 中做一些更复杂的 JSON 事情

标签: android json linkedin-api


【解决方案1】:

太好了,感谢@cricket_007,我能够追踪到如何解决这个问题。我有一个嵌套的 JSON 文件作为响应,这意味着我必须首先获取第一级,即 responseData 键,然后将其提取到另一个新的 JSONObject 中,然后从那里提取第一个和最后一个姓名。这是工作代码片段:

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

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2018-07-15
    • 2023-03-20
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多