2011-06-16 7 views
4

J'ai une classe de service Web qui tire avec succès mon JSON d'un flux dans un String. Je veux utiliser Gson pour l'analyser dans un List d'une classe personnalisée, mais l'analyse rattrape en quelque sorte. Maintenant, le code qui fait l'analyse ressemble à ceci: http://pastie.org/2079115. Le JSON est inclus.Analyser Gson avec Json ne fonctionne pas pour Android

je crois que le problème se produit à cause de cette couche supplémentaire de

"article": { ... }, "article": { ... } ... 

presque tout ce que je peux trouver en ligne me dit de le faire comme ci-dessus, y compris l'API Gson.

Le problème est que la variable articles finit comme une liste avec le nombre correct d'articles, mais toutes les données dans chaque article est nulle. Je l'ai joué avec la structure de

Type collectionType = new TypeToken<ArrayList<Article>>(){}.getType; 

mais toute modification se termine juste dans les articles variable étant nulle et même pas titulaires d'articles nuls. Une idée d'où partir?

Pour référence, mon Article.java ressemble à ceci: http://pastie.org/2079165

+1

Avez-vous pensé à essayer une bibliothèque différente comme Jackson? –

+0

Passer à Jackson ne bénéficierait pas de ce problème. Jackson n'a actuellement pas de fonctionnalité permettant de déballer automatiquement les objets, et toute solution de liaison de données avec Jackson serait pour la plupart identique à des solutions de liaison de données similaires avec Gson. –

+1

Je souhaite vraiment que les frameworks n'ajoutent pas ces couches (généralement inutiles) d'emballage supplémentaire - elles semblent être n ° 1 source de confusion pour les développeurs. Et si les libs doivent supporter un tel emballage est une épée à double tranchant: plus de soutien il y a, plus cette "caractéristique" s'utilise ... – StaxMan

Répondre

3

Le problème est que la structure JSON ne correspond pas à la structure Java essayant d'être désérialisé dans, et aucun traitement de désérialisation personnalisé pour gérer le décalage est prévu . Donc, oui, "le problème se produit à cause de cette couche supplémentaire".

Une solution simple serait de changer la structure Java pour correspondre à la structure JSON. La structure JSON est

an array of 
    an unnamed object with 
     one element named article with value of 
      an object with 
       seven elements named author_id, body, catagory, created_at, id, published, updated_at 

Voici un exemple utilisant le même JSON que dans la question d'origine.

import java.io.FileReader; 
import java.lang.reflect.Type; 
import java.util.ArrayList; 

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 
    Type collectionType = new TypeToken<ArrayList<ArticleContainer>>() {}.getType(); 
    ArrayList<ArticleContainer> articles = gson.fromJson(new FileReader("input.json"), collectionType); 
    System.out.println(gson.toJson(articles)); 
    } 
} 

class ArticleContainer 
{ 
    Article article; 
} 

class Article 
{ 
    public int author_id; 
    public String body; 
    public String catagory; 
    public String created_at; 
    public int id; 
    public String published; 
    public String updated_at; 
} 
+0

C'était exactement le tweak dont j'avais besoin. Merci un million! – chrisk

+0

Je suis désolé, je ne comprends pas comment l'utiliser .... Je suis en train d'analyser quelque chose de similaire qui a expliqué dans l'exemple de l'heure ...Le problème que je ne peux pas Parse est: "classification": "ab 0", "genres": "Drama", "remorque": \t { "de": \t [{ "id": "11471452", \t "name": "trailer 1", \t "hq": false}], "ov": []}, "trailer_url": "xxx", ... en commençant par la remorque .. son seul entrée là, tout le reste fonctionne ... – cV2

+1

@ cV2 - Si vous avez une question, je suggère de créer un nouveau post. –

Questions connexes