1

私は 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をにキャストできないというエラーが発生します。どうしてこれなの?jsonTextJSONArrayreadJsonFromUrlJSONArraysJSONObjectJSONArray

JSONArray json1 = (JSONArray) reader.readJsonFromUrl(baseURL).get("results");
System.out.println(json1);
System.out.println(json1.get(0));
4

1 に答える 1

0

その理由は単純に、JSON 入力データの構造にあります。これはresultsプロパティのみを持つ JSON オブジェクトであり、その値は配列であり、この配列には実際に必要なデータが含まれています。

単一のプロパティが必要なデータを含む配列であるオブジェクトがあるため、オブジェクト全体を解析して配列を取得する必要があります。

これは、単一のプロパティしか持たないかなり些細なオブジェクトのように見えますが、JSON 応答では、実際にはあらゆる種類のネットワーク通信では珍しいことではありません。実際に必要な結果は、提供する追加のプロパティを含むオブジェクトにラップされます。実際の結果データに関連付けられたメタ情報。

この外側のオブジェクトは、結果を含むエンベロープと考えてください。

読み取りメソッドで外側のオブジェクトを破棄することにより、応答を解析した結果 (readJsonFromUrlメソッドの結果) を配列にすることができますが、保持したいオブジェクトがさらに含まれている場合があります。たとえば、ヘッダーなどです。結果リストに付随するデータ/メタ情報。データの使用方法に影響を与える可能性があります。

于 2012-07-26T07:00:46.957 に答える