我正在尝试使用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
},...
以下是请求的网址:
那么问题是什么? Json真的畸形吗?或者我做了不对的事情?
谢谢,安东尼
编辑:
我现在确定问题来自于请求,我通过浏览器将请求的响应粘贴到我在服务器Apache中托管的文本文件中,并且它工作正常。我能够解析Json的回应。
答案 0 :(得分:2)
更改此代码:
if (name.equals("items")) {
questions = readQuestionsArray(reader);
}
到此代码:
if (name.equals("items")) {
questions = readQuestionsArray(reader);
} else {
reader.skipValue();
}
否则你最终会连续两次调用nextName()
,这是无效的。
答案 1 :(得分: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);
}
}