Question

En bref, voici une esquisse de l'objet JSON je veux analyser en JAVA:

{
    object1: {
            item1: //[String | Array | Object] ,
            item2: // ...
            //<> more items
    object2: { /* .. */ }
    //<> more objects
}

Ce sont les POJO j'ai créé pour l'analyse syntaxique (je laisse les déclarations de import pour souci de concision):

(1) La représentation de l'objet JSON complet

public class JObjectContainer {

    private List<JObject> jObjects ;

    public JObjectContainer() { }

    //get & set methods

}

(2) La représentation des objets imbriqués:

 public class JObject {

    private String id ;
    private List<JNode> jObjects ;

    public JObject() { } 

    //get & set methods

}

(3) La représentation des éléments:

 public class JNode {

    private JsonElement item1 ;
    private JsonElement item2 ;
    //<> more item fields

    public JNode() { }

    //get & set methods

}

Maintenant, la création d'une instance Gson (FileReader pour l'importation du jsonFile),

 Gson gson = new Gson() ;
 JObjectContainer joc = gson.fromJson(jsonFile,JObjectContainer.class) ;

Je reçois un NullPointerException chaque fois que je tente d'accéder à l'objet analysable (par exemple à travers un ListIterator). Gson fait cependant créer un objet de la classe I spécifié et ne pas jeter des erreurs suivantes.

Je sais que cela a été fait auparavant. Alors, qu'est-ce que je manque?

TIA

Était-ce utile?

La solution

Ce n'est pas possible. Vous devez modifier votre structure JSON pour représenter object1, object2, etc comme des éléments d'un tableau . En ce moment, ils sont des propriétés d'un objet dont il est apparemment inconnu combien d'entre eux seront (sinon vous ne tentez pas de la carte comme un List). Gson est intelligent, mais pas que smart:)

Alors, comme un exemple de base, cette structure JSON avec un tableau:

{ nodes:
  [
    { item1: 'value1a', item2: 'value2a' },
    { item1: 'value1b', item2: 'value2b' },
    { item1: 'value1c', item2: 'value2c' }
  ]
}

en combinaison avec la représentation Java (qui ne doit pas nécessairement être appelé POJO, mais juste javabean ou modèle objet ou objet de valeur).

public class Container {
    private List<Node> nodes;
    // +getter.
}

public class Node {
    private String item1;
    private String item2;
    // +getters.
}

et cet appel Gson

Container container = new Gson().fromJson(json, Container.class);

devrait fonctionner.

Mise à jour : pour être clair, la structure JSON est le problème, pas la structure de votre objet Java. En supposant que la structure de votre objet Java est exactement ce que vous voulez finir avec, votre structure JSON devrait ressembler suit pour obtenir Gson faire son travail:

{ jObjects:
  [
    { id: 123, jObjects: 
      [
        { item1: 'value1a', item2: 'value2a' },
        { item1: 'value1b', item2: 'value2b' },
        { item1: 'value1c', item2: 'value2c' }
        /* etc... commaseparated */
      ]
    },
    { id: 456, jObjects: 
      [
        { item1: 'value1d', item2: 'value2d' },
        { item1: 'value1e', item2: 'value2e' },
        { item1: 'value1f', item2: 'value2f' }
        /* etc... commaseparated */
      ]
    }
    /* etc... commaseparated */
  ]
}

Seule la propriété JsonElement devrait être remplacé par String, car il est invalide.

Autres conseils

Je pense que BalusC a donné de bons indicateurs pour la question spécifique wrt GSon (et en général, un à un liaison de données); mais juste au cas où vous pensez qu'il devrait y avoir une gestion plus dynamique, vous pouvez également envisager d'autres logiciels de traitement de JSON. De nombreux paquets ont des moyens supplémentaires ou alternatives pour cartographier les choses: JSON-lib, flexjson et Jackson ont au moins des ajouts par rapport à Gson. Certains cartographie plus souple de l'offre (vous définissez les noms des choses à des types), d'autres le soutien réel pour les types polymporphic (la déclaration d'un objet, mais peut effectivement la carte sous-type qui a été publié en feuilleton).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top