[英]Parse JSON into List in Android Studio [java]
我是 Java 新手,現在我想從 API 請求中解析數據。 我已經測試了 JSONParse 中的所有類,但沒有運氣。
我使用Mini Sharma制作的 JSONParser 類
我還從它返回的 URL 准備了一個 JSON:
{
"code": "100",
"message": "success",
"data": [
{
"FullName": "Marcelius Dagpin",
"Email": "mardagz@gmail.com",
"Android_ID": "e88244s1606091f6"
}
],
"time": "0.88044500350952 ms"
}
我的做法:
class PostRegistration extends AsyncTask<String, Void, Boolean> {
private ProgressDialog pgDialog;
//On Execute Progress
@Override
protected void onPreExecute() {
super.onPreExecute();
pgDialog.setMessage("Please wait while processing your registration");
pgDialog.setTitle("Processing");
pgDialog.show();
pgDialog.setCancelable(false);
}
@Override
protected void onPostExecute(final Boolean status) {
if(pgDialog.isShowing()) {
pgDialog.dismiss();
}
}
//Running on background
@Override
protected Boolean doInBackground(String... args) {
JSONParser jsonParser = new JSONParser();
try {
JSONArray json = jsonParser.getJSONFromURL(args[0]); //http://localhost/dev/?request=post&type=user&value=VALUEHERE
JSONObject jsono = json.getJSONObject(0);
Log.d("Tag", jsono.toString());
}catch(Exception e) {
e.printStackTrace();
}
return null;
}
}
運行此代碼時遇到錯誤。
這是日志:
02-27 02:00:00.077 2180-2180/com.sprikiwiki_lab.dev.practice1 E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.sprikiwiki_lab.dev.practice1, PID: 2180
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sprikiwiki_lab.dev.practice1/com.sprikiwiki_lab.dev.practice1.RegistrationActivity}: java.lang.NullPointerException: println needs a message
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2318)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException: println needs a message
at android.util.Log.println_native(Native Method)
at android.util.Log.println_filter(Log.java:105)
at android.util.Log.d(Log.java:166)
at com.sprikiwiki_lab.dev.practice1.RegistrationActivity.onCreate(RegistrationActivity.java:79)
at android.app.Activity.performCreate(Activity.java:5411)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(Native Method)
02-27 02:00:01.367 2180-2180/com.sprikiwiki_lab.dev.practice1 I/Process﹕ Sending signal. PID: 2180 SIG: 9
老實說。
任何人都可以幫助我或提出建議。
謝謝
我分析了你的代碼,發現了一些問題。 我將逐步描述它:
與 Android 中的第一個一樣,當您想連接互聯網時,您必須在清單中注冊權限。
<uses-permission android:name="android.permission.INTERNET"/>
第二點是你如何設置DATA_URL
在這里你初始化一個變量
private static String DATA_URL = null;
在這里你想設置它
try {
//...
String DATA_URL = "http://dev.sprikiwiki-lab.com/?request=get&uid=1";
}catch (Exception e) {
//...
}
但是您創建了新變量 - 您必須像下面這樣刪除String
:
try {
//...
DATA_URL = "http://dev.sprikiwiki-lab.com/?request=get&uid=1";
}catch (Exception e) {
//...
}
此外,您可以刪除靜態 :)
下一個問題是在 getJSONFromUrl 方法內部。 你傳遞了 url 作為參數,但你什么都不做。 換線吹:
HttpGet httpGet = new HttpGet();
有了這個:
HttpGet httpGet = new HttpGet(url);
最后一個問題是你的方法結束。 您創建new JSONArray(builder);
. 您應該在此處創建 newJSONObject(builder) ,如下所示:
//Parse string to JSON object
try {
jarray = new JSONObject(builder.toString());
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
//Return json to array
return jarray;
此外,您必須將jarray
類型jarray
為JSONObject
並返回getJSONFromURL
方法的類型
筆記:
=>如果字符串以{
開頭表示字符串是一個JSONObject
=>如果字符串以[
開頭表示字符串為JSONArray
帶有問題的已發布 json 字符串以{
開頭。
需要更改getJSONFromURL
方法:
1.將服務器響應 String 轉換為JSONObject
而不是JSONArray
:
JSONObject jsonObject=new JSONObject(<response_string>);
2. 將getJSONFromURL
方法的返回類型從 JSONArray 改為 JSONObject
3.在JSONObject
獲取getJSONFromURL
響應:
JSONObject json = jsonParser.getJSONFromURL(args[0]);
您 RegistrationActivity 的第 79 行試圖將 NULL 打印到 logcat。 確保您沒有向 Log.d() 方法發送 NULL 字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.