18

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

4

6 回答 6

23

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

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

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);
// ...
于 2011-06-14T19:18:08.047 回答
4

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();
于 2013-05-25T16:51:23.133 回答
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);
    }
}

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

于 2017-05-30T14:53:18.043 回答
1

一个老问题,但很难弄清楚这一点。ignoreContentType如果您设置为.js,则 Jsoup 可以获取 JSON 数据true。但是,它仍然像这样将 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();
于 2020-02-16T09:41:53.263 回答
0

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

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

于 2011-06-14T19:07:53.720 回答
0

我已经看到很多答案和人们编写的代码页面,我不知道为什么,但是您可以使用 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();
}
于 2016-07-26T09:54:05.323 回答