J'essaye d'employer l'api-stackexchange avec java mais quand je fais la demande et essaye d'analyser la réponse avec un analyseur de json j'ai une erreur.Java Http demande sur api.stackexchange avec la réponse de 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();
}
}
Et l'erreur est:
com.google.gson.stream.MalformedJsonException: valeur littérale prévue à la ligne 1 colonne 19
Voici un exemple de 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
},...
Voici l'URL de la demande:
Alors, quel est le problème? Le Json est-il vraiment mal formé? Ou est-ce que j'ai fait quelque chose qui ne va pas?
Merci, Anthony
Edit:
Je suis maintenant sûr que le problème vient à la demande, je colle la réponse de la demande par l'intermédiaire d'un navigateur dans un fichier texte que je serai l'hôte dans un serveur Apache et ça marche bien. Je suis capable d'analyser le Json de la réponse.
D'ailleurs, je suis l'un des mainteneurs Gson et vous m'a fait paniquer un peu sur cette question. Il m'a fallu une bonne dizaine de minutes pour comprendre quel est le problème! –
Merci, mais cela ne résout pas mon problème. Je pense que le problème est sur la demande http. La réponse n'est peut-être pas un Json bien formé. Pourquoi le reader.nextString() me donne des caractères spéciaux et pas la vraie chaîne suivante. – AnthonyMaia
Est-ce une nomenclature? http://blog.publicobject.com/2010/08/handling-byte-order-mark-in-java.html –