私は Web プログラミングをいじり始めたばかりで、音楽 Web サイトの API から特定の音楽アーティストに関する情報を取得しようとしています。ここにある JSON.simple ツールキットを使用しています。
これが私のコードです。2 つのクラス、1 つは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);
の最後のprintステートメントは、main
私にこれを与えます:
{"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\
さらに約 12 人のアーティストがいて、すべて中かっこで区切られたコンマで個別に区別されています。
だから私は次のようにして「取得」し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
そもそものポイントは何ですか? また、解析結果を直接 aJSONArray
に設定できない理由はありますか? メソッド内のすべての「JSONObject」を に変更しようとすると、 aをにキャストできないというエラーが発生します。どうしてこれなの?jsonText
JSONArray
readJsonFromUrl
JSONArrays
JSONObject
JSONArray
JSONArray json1 = (JSONArray) reader.readJsonFromUrl(baseURL).get("results");
System.out.println(json1);
System.out.println(json1.get(0));