我正在使用jsoup来抓取一些HTML数据,而且效果很好。现在我需要提取一些JSON内容(只有JSON,而不是HTML)。我可以使用jsoup轻松完成此操作,还是必须使用其他方法? jsoup执行的解析是对JSON数据进行编码,因此无法使用Gson正确解析。
谢谢!
答案 0 :(得分:21)
虽然很棒,Jsoup是一个HTML解析器,而不是JSON解析器,所以在这种情况下它是无用的。如果您尝试过,Jsoup会将返回的JSON隐式放在<html><head>
中,依此类推。你不想拥有它。 Gson是一个JSON解析器,所以你肯定需要它。
您的具体问题可能是您不知道如何提供将JSON返回给Gson的URL。在这种情况下,您需要使用URL#openStream()
获取InputStream
并使用InputStreamReader
将其装饰成Reader
,最终可以将其Gson#fromJson()
输入接受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);
// ...
答案 1 :(得分: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();
答案 2 :(得分:0)
我不知道jsoup,但如果它是有效的JSON,那么Gson应该能够解码(可能需要为自定义类设置一些自定义反序列化器)。
如果JSON无效并且您收到错误,则jsoup中存在错误。
答案 3 :(得分: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();
}
答案 4 :(得分:0)
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的依赖关系。
答案 5 :(得分:0)
一个古老的问题,但很难解决。如果将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();