[英]Parsing and retrieving information from JSON in Java — JSONObject vs. JSONArray?
我剛剛開始搞一些網絡編程,並試圖從音樂網站的API中檢索有關某些音樂藝術家的信息。 我正在使用此處找到的JSON.simple工具包。
這是我的代碼。 有兩個類,一個是JSONReader
:
import org.json.simple.*;
import org.json.simple.parser.*;
import java.net.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
public class JSONReader {
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
public static JSONObject readJsonFromUrl(String url) throws IOException, ParseException {
JSONParser parser = new JSONParser();
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
Object obj = parser.parse(jsonText);
JSONObject result = (JSONObject) obj;
return result;
} finally {
is.close();
}
}
}
好的,這是我的Main
班:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("Starting execution of program...");
String searchQuery = args[0];
JSONReader reader = new JSONReader();
System.out.println("Beginning HTTP request...");
String baseURL = "http://api.discogs.com/database/search?q=" + searchQuery + "&type=artist";
JSONObject json = reader.readJsonFromUrl(baseURL);
System.out.println(json);
main
末尾的print語句為我提供了這一點:
{"results":[{"id":22898,"title":"Tool","type":"artist","resource_url":"http:\/\/api.discogs.com\/artists\/22898","uri":"\/artist\/Tool","thumb":null},{"id":5481,"title":"DJ Tool","type":"artist","resource_url":"http:\/\/api.discogs.com\/artists\/5481","uri":"\/artist\/DJ+Tool","thumb":null},{"id":186087,"title":"Tool (3)","type":"artist","resource_url":"http:\/\/api.discogs.com\/artists\/186087","uri":"\/artist\/Tool+%283%29","thumb":null},{"id":108078,"title":"Rave Tool","type":"artist","resource_url":"http:\/\/api.discogs.com\/artists\
還有大約十二位藝術家,每位藝術家都用花括號大括號和逗號分隔。
因此,我通過執行以下操作來“獲取” results
:
System.out.println(json.get("results"));
最后是:
[{"id":22898,"title":"Tool","type":"artist","resource_url":"http:\/\/api.discogs.com\/artists\/22898","uri":"\/artist\/Tool","thumb":null},{"id":5481,"title":"DJ Tool", ... ]
問題是,我希望能夠從搜索結果中提取所有十幾位藝術家。
我將上述內容轉換為JSONArray
,如下所示,然后可以“獲取”搜索結果的索引。 在這篇漫長的帖子之后,我的問題是:這是為什么? 從本質JSONObject
,如果需要使用JSONArray
來訪問結果索引才能工作,那么JSONObject
首先要指向什么? 另外,是否有原因我無法設置將jsonText
直接解析為JSONArray
? 當我嘗試將readJsonFromUrl
方法中的所有“ JSONObject”更改為JSONArrays
,會發生錯誤,表示無法將JSONObject
轉換為JSONArray
。 為什么是這樣?
JSONArray json1 = (JSONArray) reader.readJsonFromUrl(baseURL).get("results");
System.out.println(json1);
System.out.println(json1.get(0));
原因很簡單,就是您的JSON輸入數據的結構:這是一個JSON對象,只有一個results
屬性,其值是一個數組,該數組包含您實際想要的數據。
由於您有一個對象,該對象的單個屬性是一個包含所需數據的數組,因此必須解析整個對象才能獲取該數組。
這似乎是一個非常瑣碎的對象,它只有一個屬性,但這在JSON響應中,在任何形式的網絡通信中都並不少見:您實際想要的結果包裝在一個對象中,該對象有時會包含提供與實際結果數據關聯的元信息。
將此外部對象視為包含結果的信封 。
通過丟棄read方法中的外部對象,可以得到解析響應的結果readJsonFromUrl
方法的結果-數組,但是有時您可能想要保留的包含對象會更多,例如一些結果列表附帶的標頭數據/元信息,可能會影響您使用數據的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.