簡體   English   中英

將 JSON 數據解析為 Java 對象數組

[英]Parse JSON data into Java Object Array

我正在嘗試收集 json 數據並將其解析為 java 對象,然后將其添加到對象數組中,以便稍后顯示到我的列表視圖和片段中。 這是我的代碼:

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ArrayList<Character> characterArray = new ArrayList<Character>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CharacterGetData characterGetData = new CharacterGetData();
        characterGetData.execute("https://swapi.dev/api/people/?format=json");
    }

//Character Class
class Character{
       String name;
       String height;
       String mass;

}

    class CharacterGetData extends AsyncTask<String, String, String> {
        String name;
        String height;
        String mass;


        @Override
        protected String doInBackground(String... args) {

            try {

                URL obj = new URL(args[0]);
                HttpURLConnection connection = (HttpURLConnection) obj.openConnection();
                connection.setRequestMethod("GET");


                BufferedReader in = new BufferedReader(
                        new InputStreamReader(connection.getInputStream()));
                String line;
                StringBuffer response = new StringBuffer();
                while ((line = in.readLine()) != null) {
                    response.append(line);

                }
                in.close();

                JSONObject jsonObj = new JSONObject(response.toString());
                Character character1 = new Character();
                character1.name = jsonObj.getString("name");
                character1.height = jsonObj.getString("height");
                character1.mass = jsonObj.getString("mass");
                characterArray.add(character1);


                Log.i("MainActivity", "The name is " + character1.name + "the height is " + character1.height);


            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException | JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
    }}

代碼運行正常,但是在嘗試使用日志消息確認結果時,我在調試器中收到以下內容:

W/System.err: org.json.JSONException: No value for name
W/System.err:     at org.json.JSONObject.get(JSONObject.java:400)
W/System.err:     at org.json.JSONObject.getString(JSONObject.java:561)
W/System.err:     at com.example.androidlabs.MainActivity$CharacterGetData.doInBackground(MainActivity.java:71)
W/System.err:     at com.example.androidlabs.MainActivity$CharacterGetData.doInBackground(MainActivity.java:43)
W/System.err:     at android.os.AsyncTask$3.call(AsyncTask.java:394)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
W/System.err:     at java.lang.Thread.run(Thread.java:923)

JSON 數據(在https://swapi.dev/api/people/?format=json找到)看起來像:

{"count":82,"next":"https://swapi.dev/api/people/?page=2&format=json","previous":null,"results":[{"name":"Luke Skywalker","height":"172","mass":"77","hair_color":"blond","skin_color":"fair","eye_color":"blue","birth_year":"19BBY","gender":"male","homeworld":"https://swapi.dev/api/planets/1/","films":["https://swapi.dev/api/films/1/","https://swapi.dev/api/films/2/","https://swapi.dev/api/films/3/","https://swapi.dev/api/films/6/"],"species":[],"vehicles":["https://swapi.dev/api/vehicles/14/","https://swapi.dev/api/vehicles/30/"],"starships":["https://swapi.dev/api/starships/12/","https://swapi.dev/api/starships/22/"],"created":"2014-12-09T13:50:51.644000Z","edited":"2014-12-20T21:17:56.891000Z","url":"https://swapi.dev/api/people/1/"}

您可以看到有一個名稱標簽,所以我不確定為什么會收到此錯誤,也不知道如何解決此問題。 我也嘗試使用 JSONArray 但也出現錯誤。 任何建議,將不勝感激!

您應該從響應 JSONObject 中獲取結果 JSONArray 並像下面這樣迭代它。

JSONObject jsonObj = new JSONObject(response.toString());
JSONArray jsonArray = jsonObj.getJSONArray("results");
for (int i = 0 ; i < jsonArray.length(); i++) {
     JSONObject charecterObj = jsonArray.getJSONObject(i);
     Character character1 = new Character();
     character1.name = charecterObj.getString("name");
     character1.height = charecterObj.getString("height");
     character1.mass = charecterObj.getString("mass");
     characterArray.add(character1);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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