Question

J'essaie d'analyser une structure JSON similaire à celle-ci :

    {
 "cars": {
  "112": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1998"
  },
  "642": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1990"
  },
  "9242": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "2001"
  }
 }}

J'ai une classe CarEntity définie avec les attributs makeName,model,year définis et accessibles via les setters/getters.

J'essaie de désérialiser ce JSON comme ceci :

    Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json);

et ça ne marche pas :( Il le désérialise mais pas en Map<String, CarEntity> mais plutôt dans une carte profonde (quelque chose comme Map<String, Map<String, Map<String, String>>> )

Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Votre problème est que votre json a deux cartes.Celui qui contient la clé « voitures » et celui qui contient la véritable CarEntity.Malheureusement, vous ne pouvez pas faire référence à une seule clé dans une carte et attribuer des types uniquement sur cette clé pour le moment.Généralement, la définition de types sur les valeurs des collections fait référence à toutes les valeurs de la collection.Vous n'avez pas besoin de spécifier les types pour la première carte contenant la clé "cars" car elle la désérialisera par défaut.

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String,Map<String, CarEntity>>>()
    .use("values.values", CarEntity.class )
    .deserialize(json).get("cars");

Le chemin « values.values » fait référence aux valeurs de la carte externe, puis les valeurs de la carte suivante traversant sont toutes des instances de CarEntity.

J'ai envisagé de modifier les expressions de chemin pour qu'elles soient plus expressives, vous permettant de cibler une valeur unique dans une collection, mais cela augmente la surcharge liée à leur évaluation et la compatibilité ascendante est un défi.

Autres conseils

Vous êtes le plus susceptible d'être mordu par Java Type Erasure: bibliothèque JSON en question ne sais pas de type que vous voulez; tout ce qu'il voit est équivalent de carte. Donc, vous devez spécifier le type de valeur au moins en quelque sorte. Espérons que les points de documentation FlexJSON comment.

Sinon, vous pouvez être en mesure de sous-classe HashMap dans votre propre type (étend MyEntityMap HashMap), car saisissez les informations peuvent être déduites à partir du type super générique; et MyEntityMap.class passant fourniraient des informations de type que la plupart des bibliothèques JSON peuvent utiliser (Jackson et GSON au moins).

Si ceux-ci ne fonctionnent pas, les bibliothèques Jackson et GSON peuvent traiter ce cas d'utilisation facile; les deux ont des méthodes pour spécifier les types génériques pour désérialisation.

Il suffit d'ajouter un autre appel à get("cars") comme:

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json).get("cars");

string JSON a probablement été publié en feuilleton à partir d'une cars variable typée comme Map<String, CarEntity>

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