簡體   English   中英

從Java中的JSON解析和檢索信息-JSONObject與JSONArray?

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

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