繁体   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