2012-06-04 3 views
0

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:

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

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.

Répondre

2

Les données de la réponse sont compressées avec l'algorithme de dégonflement. Donc, je le InputStream avec encapsulé un 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); 
    } 
} 
2

Modifier ce code:

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

à ce code:

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

Sinon, vous finissez par appeler nextName() deux fois de suite, ce qui est invalide.

+0

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! –

+0

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

+0

Est-ce une nomenclature? http://blog.publicobject.com/2010/08/handling-byte-order-mark-in-java.html –

Questions connexes