2016-08-02 1 views
0

J'ai une classe définie comme suit:Unmarshalling json en inversant l'effet du renommage @XmlElement?

public class Contact implements Serializable 
{ 
    private final static long serialVersionUID = 1L; 
    @XmlElement(name = "last-name", required = true) 
    protected String lastName; 
    @XmlElement(name = "first-name", required = true) 
    protected String firstName; 
    @XmlElement(required = true) 
    protected String id; 
    @XmlElement(name = "primary-phone") 
    protected String primaryPhone; 
    @XmlElement(name = "cellular-phone") 
    protected String cellularPhone; 
} 

Cette classe est utilisée pour générer des versions Marshalled JSON qui sont communiqués sur Internet. Du côté de la réception, j'essaye d'unmarshall le JSON, mais j'ai de la difficulté à cause de la différence de nommage, par exemple la bibliothèque unmarshalling attend une variable nommée primaryPhone, pas primary-phone qui est ce que j'ai à la réception. En plus du pré-traitement du texte JSON reçu pour remplacer manuellement les instances de primary-phone par primaryPhone, existe-t-il un autre moyen plus automatisé pour éviter ce problème? Le problème avec la conversion manuelle des chaînes est que demain si la définition de classe change, le code que j'écris devra également être mis à jour.

Voici un extrait de code montrant ce que je fais actuellement sans aucune conversion de chaîne manuellement:

String contact = "\"last-name\": \"ahmadka\""; 
ObjectMapper objMapper = new ObjectMapper(); 
Contact cObj = objMapper.readValue(contact, Contact.class); 

Mais avec le code ci-dessus j'obtenir une exception sur la dernière ligne de lecture suivante:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "last-name" (class Contact), not marked as ignorable (5 known properties: "lastName", "cellularPhone", "id", "primaryPhone", "firstName", ]) 
at ...........//rest of the stack 

Répondre

1

Jackson par défaut ne connaît pas les annotations JAXB (par exemple @XmlRootElement). Il doit être configuré avec un module externe pour avoir cette capacité. Sur le serveur, vous avez probablement cela sans même le savoir.

Du côté client si vous souhaitez configurer le ObjectMapper, vous devez ajouter le following module:

<dependency> 
    <groupId>com.fasterxml.jackson.module</groupId> 
    <artifactId>jackson-module-jaxb-annotations</artifactId> 
    <version>${jackson2.version}</version> 
</dependency> 

La configuration juste

ObjectMapper objMapper = new ObjectMapper(); 
mapper.registerModule(new JaxbAnnotationModule()); 
+0

Donc, vous dites que si j'ajouter la dépendance ci-dessus, puis appelez 'mapper.registerModule (new JaxbAnnotationModule());' avant tout unmarshalling, cela devrait fonctionner? – Ahmad

+0

Oui. Il reconnaîtra alors '@ XmlElement' et utilisera' last-name' pour mapper le JSON au lieu de 'lastName' –