Gson et les Argonautes - problème de conversion de matrice de javascript, à chaîne json, à l'aide de java pojo gson. Essayer d'obtenir mes structures correctes

StackOverflow https://stackoverflow.com/questions/3657497

  •  01-10-2019
  •  | 
  •  

Question

Voici ma chaîne JSON, que je suis acessing en java:

json = 
[
    {"id":"123456","Data":"skill2","dmlcrud":false},
    {"id":"123456","Data":"skill3","dmlcrud":true},
    {"id":"123456","Data":"skill14","dmlcrud":true},
    {"id":"123321","Data":"skill1","dmlcrud":false},
    {"id":"123321","Data":"skill14","dmlcrud":false}
]

Je veux maintenant mettre dans une collection si idéalement / théoriquement je voudrais faire:

List<Person> personList = new Gson().fromJson(json, Person.class);

et personList.size () serait = 5. Je voudrais ensuite une boucle à travers PersonList et préforme mes actions pertinentes.

Cependant, je crois comprendre que je besoin de créer une classe de conteneur, qui contient lui-même la liste des personnes? Ainsi, au lieu de (getters publics / setters supprimés par souci de concision, sans doute la syntaxe errror là aswell).

Class Person {
   private integer id;
   private String Data;
   private Boolean dmlCrud ;
}

Je vraiment besoin de quelque chose?

Class container{
   List<Person> personList;


   static class Person {
      private integer id;
      private String Data;
      private Boolean dmlCrud ;
   }
}

Mais je alors besoin de modifier la json javascript pour aswell somethign différent? Ce qui semble assez problématique comme moi la création de la chaîne JSON à partir d'un tableau javascript, en utilisant JSON.stringifier.

Toute aide reçue avec reconnaissance.

EDIT

la solution j'était d'ajouter

public List<Person> personList;

à la classe personne et modifier l'objet json de sorte qu'il était

{ "personList" :
    [
        {"id":"123456","Data":"skill2","dmlcrud":false},
        {"id":"123456","Data":"skill3","dmlcrud":true},
        {"id":"123456","Data":"skill14","dmlcrud":true},
        {"id":"123321","Data":"skill1","dmlcrud":false},
        {"id":"123321","Data":"skill14","dmlcrud":false}
    ]
}

l'appel gson peut alors être

Person person = new Gson().fromJson(json, Person.class);

et les données accédées dans une liste comme si

List<Person> personList = person.getPersonList();

EDIT 2

Une seconde, une meilleure solution est d'utiliser cette matrice de json

[
        {"id":"123456","Data":"skill2","dmlcrud":false},
        {"id":"123456","Data":"skill3","dmlcrud":true},
        {"id":"123456","Data":"skill14","dmlcrud":true},
        {"id":"123321","Data":"skill1","dmlcrud":false},
        {"id":"123321","Data":"skill14","dmlcrud":false}
]

et puis utilisez

Type listType = new TypeToken<List<SkillsGsonTO>>() {}.getType();
List<Person> personList  = new Gson().fromJson(json,listType);
Person person1 = personList.get(0);

où la classe d'origine est utilisé

Class Person {
       private integer id;
       private String Data;
       private Boolean dmlCrud ;
    }
Était-ce utile?

La solution

Vous pouvez utiliser une classe conteneur, mais cela n'a de sens que si vous avez besoin de transporter des propriétés supplémentaires sur la liste des personnes. Si ce n'est pas le cas, vous pouvez convertir en un java.util.List aussi bien. Je pense que vous devez spécifier le « nom » de la propriété de la liste comme un élément racine dans votre chaîne JSON. Ainsi, par exemple si vous êtes l'objet de domaine est une liste d'objets personne, que votre élément racine JSON est: « personnes » ou « PersonList ». Donc, vous JSON pourrait ressembler à:

"persons" : {[
     {"id":"123456","Data":"skill2","dmlcrud":false},
     {"id":"123456","Data":"skill3","dmlcrud":true},
     {"id":"123456","Data":"skill14","dmlcrud":true},
     {"id":"123321","Data":"skill1","dmlcrud":false},
     {"id":"123321","Data":"skill14","dmlcrud":false}
]}

Je pourrais être un peu hors avec la syntaxe, mais il devrait être quelque chose de semblable à cela. Donc, pour résumer:

Dans votre cas, vous pouvez vous laisser intacte personne appartient à la classe et gson devrait être en mesure de créer la liste des personnes pour vous de la chaîne JSON je.

A partir de l'API Gson docs: Si l'objet que vous êtes désérialisation est un ParameterizedType (à savoir contient au moins un paramètre de type et peut être un tableau), vous devez utiliser la méthode fromJson (String, Type). Voici un exemple pour un deserialing ParameterizedType:

 Type listType = new TypeToken<List<String>>() {}.getType();

 Gson gson = new Gson();
 List<String> target2 = gson.fromJson(json, listType);

Dans votre cas, il serait:

Type listType = new TypeToken<List<Person>>() {}.getType();
List<Person> persons = new Gson().fromJson(json, listType);

où JSON est votre chaîne JSON évidemment

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