【发布时间】: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
-
欢迎您! Gson/Jackson 是非常有用的库,可以在 Java 中做一些更复杂的 JSON 事情
标签: android json linkedin-api