簡體   English   中英

在 Android Studio 中將 JSON 解析為 List [java]

[英]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類型jarrayJSONObject並返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM