Java: Jackson polymorphes JSON de la désérialisation d'un objet avec une interface bien?
Je suis à l'aide de Jackson ObjectMapper
pour désérialiser une représentation JSON d'un objet qui contient une interface comme l'une de ses propriétés. Une version simplifiée du code peut être vu ici:
https://gist.github.com/sscovil/8735923
En gros, j'ai une classe Asset
avec deux propriétés: type
et properties
. Le JSON modèle ressemble à ceci:
{
"type": "document",
"properties": {
"source": "foo",
"proxy": "bar"
}
}
La properties
propriété est définie comme une interface appelée AssetProperties
, et j'ai plusieurs classes qui l'implémentent (par exemple DocumentAssetProperties
, ImageAssetProperties
). L'idée est que les fichiers d'image ont des propriétés différentes (hauteur, largeur) que les fichiers de documents, etc.
J'ai travaillé hors des exemples dans cet article, de lire à travers des documents et des questions ici sur soi et au-delà, et expérimenté avec différentes configurations dans le @JsonTypeInfo
annotation paramètres, mais je n'ai pas été capable de craquer cet écrou. Toute aide serait grandement appréciée.
Plus récemment, à l'exception que je reçois est: est-ce
java.lang.AssertionError: Could not deserialize JSON.
...
Caused by: org.codehaus.jackson.map.JsonMappingException: Could not resolve type id 'source' into a subtype of [simple type, class AssetProperties]
Merci d'avance!
SOLUTION:
Avec un grand merci à @Michał Ziober, j'ai été en mesure de résoudre ce problème. J'ai aussi été en mesure d'utiliser un Enum comme un type id, qui a pris un peu de Googling. Voici une mise à jour de Gist avec code de travail:
https://gist.github.com/sscovil/8788339
- Ce n'sortie Json chercher quelque chose comme cela? Est-il un tas de métadonnées intégrées?
- Merci pour le lien pour le programmerbruce post. Quelle grande ressource
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
JsonTypeInfo.As.EXTERNAL_PROPERTY
au lieu deJsonTypeInfo.As.PROPERTY
. Dans ce cas, votreAsset
classe devrait ressembler à ceci:Voir aussi ma réponse à cette question: Jackson JsonTypeInfo.Comme.EXTERNAL_PROPERTY ne fonctionne pas comme prévu.
POJO
s etJSON
ressembler?