0

我正在尝试将 api-stackexchange 与 java 一起使用,但是当我执行请求并尝试使用 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

更改此代码:

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

到这段代码:

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

否则你最终nextName()会连续调用两次,这是无效的。

于 2012-06-05T05:00:44.307 回答
2

响应中的数据使用 deflate 算法进行压缩。所以,我用 GZIPInputStream 封装了 InputStream:

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 回答