我正在使用jsoup抓取一些HTML数据,效果很好。现在我需要提取一些JSON内容(仅JSON,而非HTML)。我可以使用jsoup轻松完成此操作吗?还是必须使用其他方法?jsoup执行的解析是对JSON数据进行编码,因此无法使用Gson正确解析。
r7xajy2e1#
Jsoup是一个HTML解析器,而不是JSON解析器,所以在这种情况下它是无用的。如果你尝试这样做,Jsoup会把返回的JSON隐式地放在<html><head>中,以此类推。你不想这样做。Gson是一个JSON解析器,所以你肯定需要它。具体的问题可能是你不知道如何将一个返回JSON的URL提供给Gson,在这种情况下,你需要使用URL#openStream()来获取它的InputStream,并使用InputStreamReader将其修饰为Reader,最后将其提供给Gson#fromJson(),后者接受Reader。
<html><head>
URL#openStream()
InputStream
InputStreamReader
Reader
Gson#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); // ...
yizd12fk2#
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();
slmsl1lt3#
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。
http://time.jsontest.com
uyto3xhc4#
这是一个老问题,但要弄清楚这个问题有点困难。如果将ignoreContentType设置为true,Jsoup可以获取JSON数据。但是,它仍然将JSON内容 Package 在HTML标记中,如下所示。
ignoreContentType
true
<html> <head></head> <body> { JSON DATA } </body> </html>
为了消除这一点,我们可以简单地获得如下所示的正文内容。
Connection connection = Jsoup.connect("URL").ignoreContentType(true); connection.execute(); String strJsonData = connection.get().body().text();
q9rjltbz5#
我不知道jsoup,但如果它是有效的JSON,那么Gson应该能够解码(可能需要一些自定义类的自定义反序列化器)。如果它不是有效的JSON,并且您收到错误,则jsoup中存在bug。
o2rvlv0m6#
我已经看到了许多答案和人们写的页面价值的代码,我不知道为什么,但你可以做到这一点很容易与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(); }
6条答案
按热度按时间r7xajy2e1#
Jsoup是一个HTML解析器,而不是JSON解析器,所以在这种情况下它是无用的。如果你尝试这样做,Jsoup会把返回的JSON隐式地放在
<html><head>
中,以此类推。你不想这样做。Gson是一个JSON解析器,所以你肯定需要它。具体的问题可能是你不知道如何将一个返回JSON的URL提供给Gson,在这种情况下,你需要使用
URL#openStream()
来获取它的InputStream
,并使用InputStreamReader
将其修饰为Reader
,最后将其提供给Gson#fromJson()
,后者接受Reader
。yizd12fk2#
Jsoup不是为解析JSON而设计的。请使用Gson(或任何其他java JSON库)。要使用Jsoup获取远程内容,请使用以下代码:
slmsl1lt3#
Jsoup并不解析JSON,但它可以用来轻松地获取JSON数据。
该示例使用JSoup从
http://time.jsontest.com
读取JSON数据,并使用Gson解析JSON。uyto3xhc4#
这是一个老问题,但要弄清楚这个问题有点困难。如果将
ignoreContentType
设置为true
,Jsoup可以获取JSON数据。但是,它仍然将JSON内容 Package 在HTML标记中,如下所示。为了消除这一点,我们可以简单地获得如下所示的正文内容。
q9rjltbz5#
我不知道jsoup,但如果它是有效的JSON,那么Gson应该能够解码(可能需要一些自定义类的自定义反序列化器)。
如果它不是有效的JSON,并且您收到错误,则jsoup中存在bug。
o2rvlv0m6#
我已经看到了许多答案和人们写的页面价值的代码,我不知道为什么,但你可以做到这一点很容易与GSON。