gpt4 book ai didi

java - 在 Java 中解析和检索 JSON 信息——JSONObject 与 JSONArray?

转载 作者:行者123 更新时间:2023-12-01 05:13:40 24 4
gpt4 key购买 nike

我刚刚开始搞一些网络编程,并尝试从音乐网站的 API 检索有关某些音乐艺术家的信息。我正在使用 JSON.simple 工具包,发现 here.

这是我的代码。两类,一类是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末尾的打印语句给我这个:

{"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 ,出现错误,说无法转换 JSONObjectJSONArray 。这是为什么?

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

最佳答案

原因很简单,就是 JSON 输入数据的结构:它是一个只有 results 属性的 JSON 对象,其值是一个数组,该数组包含您实际想要的数据。

由于您有一个对象,其单个属性是一个包含所需数据的数组,因此您必须解析整个对象才能获取该数组。

这看起来像是一个相当简单的对象,只有一个属性,但这在 JSON 响应中并不罕见,实际上在任何类型的网络通信中:您真正想要的结果被包装在一个对象中,该对象有时会包含额外的内容提供与实际结果数据关联的元信息的属性。

将此外部对象视为包含结果的信封

您可以通过丢弃读取方法中的外部对象来使解析响应的结果 - 您的 readJsonFromUrl 方法的结果 - 数组,但有时包含对象会包含更多内容您可能想要保留的内容,例如结果列表附带的一些标题数据/元信息,这可能会影响您使用数据的方式。

关于java - 在 Java 中解析和检索 JSON 信息——JSONObject 与 JSONArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11663705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com