[英]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.