私はjsoupを使用していくつかのHTMLデータを取得していますが、うまく機能しています。次に、いくつかのJSONコンテンツをプルする必要があります(HTMLではなくJSONのみ)。 jsoupでこれを簡単に行うことはできますか、それとも別の方法を使用して行う必要がありますか? jsoupが実行する解析は、JSONデータをエンコードしているため、Gsonでは正しく解析されません。
ありがとう!
すばらしいですが、 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);
// ...
_
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();
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の依存関係が必要です。
Jsoupについてはわかりませんが、有効なJSONであれば、Gsonでデコードできるはずです(カスタムクラス用にカスタムデシリアライザーが必要になる場合があります)。
有効なJSONではなく、エラーが発生する場合は、jsoupにバグがあります。
古い質問ですが、これを理解するのに少し苦労しました。 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();
多くの回答やページに相当するコードを書いている人を見てきました。理由はわかりませんが、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();
}