web-dev-qa-db-ja.com

JSONコンテンツの読み取り

私はjsoupを使用していくつかのHTMLデータを取得していますが、うまく機能しています。次に、いくつかのJSONコンテンツをプルする必要があります(HTMLではなくJSONのみ)。 jsoupでこれを簡単に行うことはできますか、それとも別の方法を使用して行う必要がありますか? jsoupが実行する解析は、JSONデータをエンコードしているため、Gsonでは正しく解析されません。

ありがとう!

16
Chromag

すばらしいですが、 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);
// ...
_
22
BalusC

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();
4
msangel

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の依存関係が必要です。

2
Jan Bodnar

Jsoupについてはわかりませんが、有効なJSONであれば、Gsonでデコードできるはずです(カスタムクラス用にカスタムデシリアライザーが必要になる場合があります)。

有効なJSONではなく、エラーが発生する場合は、jsoupにバグがあります。

0
Jason S

古い質問ですが、これを理解するのに少し苦労しました。 ignoreContentTypetrueに設定すると、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();
0
rahimv

多くの回答やページに相当するコードを書いている人を見てきました。理由はわかりませんが、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();
}
0
Kareem