0

java で api-stackexchange を使用しようとしていますが、リクエストを実行して json パーサーでレスポンスを解析しようとすると、エラーが発生します。

public ArrayList<Question> readJsonStream(InputStream in) throws IOException {
    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
    reader.setLenient(true);
    try {
        System.out.println(reader.nextString()); // � special character
                    return readItem(reader);
    } finally {
        reader.close();
    }
}

public ArrayList<Question> readItem(JsonReader reader) throws IOException {
    ArrayList<Question> questions = new ArrayList<Question>();

    reader.beginObject();

    while (reader.hasNext()) {
        System.out.println("here");//not print the error is before
        String name = reader.nextName();
        if (name.equals("items")) {
            questions = readQuestionsArray(reader);
        }
    }
    reader.endObject();
    return questions;
}

public final static void main(String[] args) throws Exception {

    URIBuilder builder = new URIBuilder();
    builder.setScheme("http").setHost("api.stackexchange.com").setPath("/2.0/search")
    .setParameter("site", "stackoverflow")
    .setParameter("intitle" ,"workaround")
    .setParameter("tagged","javascript");
    URI uri = builder.build();

    String surl = fixEncoding(uri.toString()+"&filter=!)QWRa9I-CAn0PqgUwq7)DVTM");
    System.out.println(surl);
    Test t = new Test();
    try {
        URL url = new URL(surl);
        t.readJsonStream(url.openStream());

    } catch (IOException e) {
        e.printStackTrace();
    }

}

エラーは次のとおりです。

com.google.gson.stream.MalformedJsonException: 行 1 列 19 に期待されるリテラル値

Json の例を次に示します。

        {
          "items": [
            {
              "question_id": 10842231,
              "score": 0,
              "title": "How to push oath token to LocalStorage or LocalSession and listen to the Storage Event? (SoundCloud Php/JS bug workaround)",
              "tags": [
                "javascript",
                "javascript-events",
                "local-storage",
                "soundcloud"
              ],
              "answers": [
                {
                  "question_id": 10842231,
                  "answer_id": 10857488,
                  "score": 0,
                  "is_accepted": false
                }
              ],
              "link": "http://stackoverflow.com/questions/10842231/how-to-push-oath-token-to-localstorage-or-localsession-and-listen-to-the-storage",
              "is_answered": false
            },...

リクエストの URL は次のとおりです。

https://api.stackexchange.com/2.0/search?tagged=javascript&intitle=workaround&site=stackoverflow&filter=!)QWRa9I-CAn0PqgUwq7)DVTM

だから問題は何ですか?Json は本当に不正な形式ですか? または、私は何か正しくないことをしましたか?

ありがとう、アンソニー

編集:

問題はリクエストにあると確信しています。サーバーApacheでホストしているテキストファイルに、ブラウザーを介してリクエストの応答を貼り付けます。正常に動作します。応答の Json を解析できます。

4

2 に答える 2

2

応答のデータは deflate アルゴリズムで圧縮されます。そこで、InputStream を GZIPInputStream でカプセル化しました。

public final static void main(String[] args) throws Exception {
    URIBuilder builder = new URIBuilder();
builder.setScheme("http").setHost("api.stackexchange.com").
        setPath("/2.0/search").
        setParameter("site", "stackoverflow").
        setParameter("intitle" ,"workaround").
        setParameter("tagged","javascript");
URI uri = builder.build();
ArrayList<Question> q =null;
String result = "";
String surl = fixEncoding(uri.toString()+"&filter=!)QWRa9I-CAn0PqgUwq7)DVTM");
System.out.println(surl);
Test t = new Test();

    try {
    URL url = new URL(surl);
    q = t.readJsonStream(new GZIPInputStream(url.openStream()));        
} 

    catch (IOException e) {
        e.printStackTrace();
    }

    System.out.println(result);

    for (Question question : q) {
        System.out.println(question.title);
    }
}
于 2012-06-07T11:55:05.457 に答える
2

このコードを変更します。

    if (name.equals("items")) {
        questions = readQuestionsArray(reader);
    }

このコードに:

    if (name.equals("items")) {
        questions = readQuestionsArray(reader);
    } else {
        reader.skipValue();
    }

そうしないとnextName()、2 回続けて呼び出すことになり、これは無効です。

于 2012-06-05T05:00:44.307 に答える