我刚刚开始讨论一些网络编程,并试图从音乐网站的API中检索某些音乐艺术家的信息。我正在使用找到here.
的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
来访问结果索引才能工作?另外,有理由我无法将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));
答案 0 :(得分:0)
原因只是JSON输入数据的结构:它是一个只有results
属性的JSON对象,其值是一个数组,该数组包含您实际需要的数据。
由于您有一个对象,其单个属性是一个包含所需数据的数组,因此必须解析整个对象以获取该数组。
这看起来像是一个只有一个属性的相当简单的对象,但这在JSON响应中并不罕见,实际上在任何类型的网络通信中:您实际需要的结果包含在有时包含其他内容的对象中提供与实际结果数据相关联的元信息的属性。
将此外部对象视为包含结果的信封。
你可以通过丢弃read方法中的外部对象来解析响应的结果 - 你的readJsonFromUrl
方法的结果 - 数组,但有时候你可能会有更多的包含对象想要保留一些可能影响数据使用方式的结果列表中的标题数据/元信息。