【问题标题】:Reading JSON Content读取 JSON 内容
【发布时间】:2011-09-14 23:20:36
【问题描述】:

我正在使用 jsoup 来抓取一些 HTML 数据,效果很好。现在我需要提取一些 JSON 内容(只有 JSON,不是 HTML)。我可以使用 jsoup 轻松做到这一点,还是必须使用另一种方法来做到这一点? jsoup 执行的解析是对 JSON 数据进行编码,因此无法使用 Gson 正确解析。

【问题讨论】:

  • 有问题的 JSON 示例怎么样?

标签: java gson jsoup


【解决方案1】:

虽然很好,Jsoup 是一个 HTML 解析器,而不是一个 JSON 解析器,所以在这种情况下它是无用的。如果您尝试过,Jsoup 会将返回的 JSON 隐式放入 <html><head> 中,依此类推。你不想拥有那个。 Gson 是一个 JSON 解析器,所以你肯定需要它。

您的具体问题可能是您不知道如何将返回 JSON 的 URL 提供给 Gson。在这种情况下,您需要使用URL#openStream() 来获取它的InputStream 并使用InputStreamReader 将其装饰成Reader,最后可以将其馈送到接受ReaderGson#fromJson()

InputStream input = new URL("http://example.com/foo.json").openStream();
Reader reader = new InputStreamReader(input, "UTF-8");
Data data = new Gson().fromJson(reader, Data.class);
// ...

【讨论】:

  • 这就是我最终的做法。正如你所说,我认为 jsoup 并不是提取直接 JSON 数据的正确工具。感谢您的帮助!
  • 也许七年前这是真的——Jsoup 会将返回的 JSON 隐式放在 中——但今天,Jsoup 可用于获取 JSON 数据。看我的例子。
【解决方案2】:

Jsoup 不是为解析 JSON 而设计的。使用 Gson(或任何其他 java JSON 库)。 要使用 Jsoup 获取远程内容,请使用:

Connection  con = HttpConnection.connect(url);
con.method(Method.POST).data(data.params).ignoreContentType(true);
Response resp = con.execute();
String body = resp.body();

【讨论】:

    【解决方案3】:

    Jsoup 不解析 JSON,但可以用来轻松获取 JSON 数据。

    package com.zetcode;
    
    import com.google.gson.Gson;
    import java.io.IOException;
    import org.jsoup.Jsoup;
    
    class TimeData {
    
        private String time;
        private Long milliseconds_since_epoch;
        private String date;
    
        @Override
        public String toString() {
            return "TimeData{" + "time=" + time + ", milliseconds_since_epoch=" 
                    + milliseconds_since_epoch + ", date=" + date + '}';
        }
    }
    
    
    public class GsonReadWebPage {
    
        public static void main(String[] args) throws IOException {
    
            String webPage = "http://time.jsontest.com";
    
            String data = Jsoup.connect(webPage).ignoreContentType(true).execute().body();
    
            Gson gson = new Gson();
            TimeData td = gson.fromJson(data, TimeData.class);
    
            System.out.println(td);
        }
    }
    

    示例使用JSoup从http://time.jsontest.com读取JSON数据 并用 Gson 解析 JSON。要执行此示例,您需要 Jsoup 和 Gson 依赖项。

    【讨论】:

      【解决方案4】:

      一个老问题,但有点难以弄清楚。如果将ignoreContentType 设置为true,Jsoup 可以获取 JSON 数据。但是,它仍然像这样将 JSON 内容包装在 HTML 标记中。

      <html>
       <head></head>
       <body>
      { JSON DATA }
       </body>
      </html>
      

      为了消除这一点,我们可以简单地获取下面给出的正文内容。

      Connection connection = Jsoup.connect("URL").ignoreContentType(true);       
      connection.execute();
      
      String strJsonData = connection.get().body().text();
      

      【讨论】:

        【解决方案5】:

        我不知道 jsoup,但如果它是有效的 JSON,那么 Gson 应该能够解码(可能需要一些自定义反序列化器用于您的自定义类)。

        如果它不是有效的 JSON 并且您收到错误,那么 jsoup 中存在错误。

        【讨论】:

          【解决方案6】:

          我看到很多答案和人们编写页面的代码,我不知道为什么,但您可以使用 GSON 轻松做到这一点。

          /**
           * Convert json string to json object
           */
          import com.google.gson.JsonObject;
          import com.google.gson.JsonParser;
          
          private JsonObject getResAsJson(String response) {
              return new JsonParser().parse(response).getAsJsonObject();
          }
          

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-21
          • 2016-01-30
          • 2016-05-25
          相关资源
          最近更新 更多