Jersey: ne Peut pas désérialiser instance de ArrayList de String
J'ai un json REST Web Services mis en œuvre à l'aide de:
Jetty, Jersey, Jersey-JSON à l'aide de Jackson.
Un de mes méthodes reçoit une instance de Personne, qui a un champ de type List<String>.
c'est à dire:
Public class Person {
List<String> names;
}
Si je l'appelle avec un tableau de noms, tout fonctionne bien! par exemple:
{ "names" : [ "Jhon", "Doe" ] }
Mais si la personne a un seul nom, mon client crée un seul élément de valeur, par exemple:
{ "names" : "Jhon" }
Quand j'essaie d'appeler le service avec une seule valeur, j'obtiens une exception:
Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token
Question:
Comment dois-je créer/configurer mon web service, afin d'être en mesure de désérialiser tableau de terrain lorsqu'ils sont envoyés à moi comme un seul élément.
--
J'ai déjà lu:
Jackson désérialisation - avec contenu ArrayList<T>
et
Comment puis-je personnaliser la sérialisation d'une liste de JAXB objets JSON?
et ce que voir la dernière réponse:
Maillot client ne peut pas deserializable json services - l'exception peut pas désérialiser exemple)
Jaxb json manquant entre parenthèses pour un élément de tableau
Mais aucun de ceux résoudre le problème.
Vous en remercie d'avance!
OriginalL'auteur lpinto.eu | 2013-01-14
Vous devez vous connecter pour publier un commentaire.
Après une longue journée, et un autre... après la lecture de beaucoup de wikis et les faq, il fonctionne enfin.
Ce que j'ai fait:
L'histoire:
J'ai été en utilisant Jersey 1.13 qui utilise (je crois) jaxb par défaut.
Je l'ai changé pour utilisation Jackson
comme décrit à:
https://stackoverflow.com/a/13895768/660990
Cela fait mon maillot utiliser jackson, mais le problème reste le même; jackson ne peut pas deserializer le tableau encore.
J'ai forcé l'utilisation de Jackson fournisseurs de:
https://stackoverflow.com/a/3143214/660990
Était une étape nécessaire, mais pas suffisant. Il est nécessaire d'activer le ACCEPT_SINGLE_VALUE_AS_ARRAY drapeau.
J'avais besoin de définir personnalisé deserializer
pour ce faire:
Personnalisation-ObjectMapper
Après avoir fait tout cela, il ne fonctionne toujours pas...
Après quelques temps de recherche, j'ai trouvé:
Jackson 2.0 avec Jersey 1.12
Qui traite de dépendances problèmes..
Cela se délectait de mon problème, Jersey v1.13 livré avec Jackson v1.9.2 j'ai besoin de Jackson v2.0
Je l'ai enlevé de la dépendance jersey-json, car il comprend jackson 1.9.2:
Et directement déclarée de la dépendance:
Référence:
jackson-jaxrs-json-fournisseur
Remarque: ce changement supprime, le Maillot capacité à utiliser Jaxb ou larguer.
Hors sujet, peut être intéressant pour quelqu'un:
Configurer Jersey/Jackson de ne PAS utiliser @XmlElement champ d'annotation pour JSON champ de nommage
où en êtes-vous de mettre le objectMapper = new ObjectMapper().configurer(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); ?
Je l'ai mis dans le constructeur de la mappeur du service.configurer( org.codehaus.jackson.carte.DeserializationConfig.Fonctionnalité.ACCEPT_SINGLE_VALUE_AS_ARRAY,true);
OriginalL'auteur lpinto.eu
Exemple 5.10 et 5.11 de cette page expliquer votre problème exact. Vous pouvez configurer le JSON générateur de force de tableaux pour un seul élément des listes, comme suit:
JSONConfiguration.mapped().arrays("names").build()
.Où voulez-vous ajouter JSONConfiguration.mappés().les tableaux("nom").build() dans le client? Quand vous avez construit à la demande, mais avant de l'envoyer?
OriginalL'auteur rmhartog
Il a travaillé pour moi en ajoutant @JsonSerialize à la classe
OriginalL'auteur Manju
Vous pouvez le faire avec des annotations dans la classe, le terrain ou au niveau de la méthode à l'aide de la JsonFormat annotation
OriginalL'auteur steven35
&
ce type comment faire ...lors de l'utilisation de yahoo place de l'api
OriginalL'auteur Zaric