2010-10-14 13 views
4

Je veux marshaler des objets NULL comme NULL dans la représentation JSON. Mais, maintenant, ne voit pas l'élément dans le JSON si l'objet est nul.Afficher null pour les objets -JSON- JAXB

Example: 
@XmlAccessType(FIELD) 
@XmlType(name="foo" propOrder={"foo"} 
class foo{ 
@XmlElement 
     private Integer foo; 
     private Integer another_foo; 
.. 

getter() 
setter() 

} 

Dans mon code, je mets l'élément foo à zéro. Mais la représentation JSON n'affiche pas l'élément dans la réponse

La réponse ressemble à ceci

"foo" :{ 
"another_foo":something 
} 

J'essayé de placer l'élément XML attribut nillable vrai. (@XmlElement (nillable = true)

Ce qui rend la réponse ressemble,

"foo" :{ 
"another_foo" : something 
"foo":{nil :true} 
} 

Je veux que ce soit comme,

"foo" :{ 
    "another_foo":something 
    "foo" : null 
    } 

Qu'est-ce que je fais mal ici?

Répondre

4

Commençons par le début: JAXB ne fait PAS JSON. C'est une API XML. Donc vous utilisez probablement un framework (à mon avis: implémentation de JAX-RS comme peut-être Jersey)? Il est nécessaire de savoir lequel vous utilisez pour donner plus d'aide. En supposant cela, la question est de savoir comment le package utilise les annotations JAXB pour guider la sérialisation JSON. Certains convertissent essentiellement les objets en XML (structure logique ou XML complet), puis convertissent en JSON en utilisant une convention. Cela peut entraîner une perte de données en raison des différences de modèle de données entre XML et JSON. Maintenant, la solution la plus simple pour la plupart des implémentations JAX-RS est de ne pas utiliser l'approche par annotation JAXB, mais un sérialiseur JSON, tel que JacksonJsonProvider de Jackson (Jackson peut également utiliser les annotations JAXB). Il inclura par défaut des valeurs nulles pour les propriétés, bien que ceci soit configurable au cas où vous voudriez supprimer des valeurs nulles.

Voici JavaDoc qui montre comment utiliser le fournisseur Jackson (spécifier FEATURE_POJO_MAPPING pour la configuration) avec Jersey, si cela peut aider.

+0

Merci Staxman, Oui, Nous utilisons le fournisseur Jackson JSON. Je pensais qu'il devrait y avoir un moyen de sortir avec les annotations JAXB. Je vais essayer ça. –

+0

Ah. Peut-être Jersey par défaut de configurer ObjectMapper pour supprimer les null? Bien que le paramètre par défaut ne le fasse pas, Jersey peut choisir de surcharger ce comportement de conservation de la même manière que les autres sérialiseurs. Quoi qu'il en soit, la méthode à appeler est dans SerializationgConfig (setSerializationInclusion), accessible en utilisant ObjectMapper.getSerializationConfig(). Il y a aussi l'annotation @JsonSerialize qui peut être utilisée pour définir l'inclusion par classe (toutes, non nulles, non-par défaut). – StaxMan

0

Je pense que la fonctionnalité de json est comme ça seulement, elle ne vous montrera pas de valeurs nulles dans la chaîne Json.Supposons un exemple, vous avez un objet avec deux attributs, disons age et name.Si l'âge est 7 et le nom est n ull, alors si d'après vous, name doit également être inclus dans l'objet JSON, alors vous devez corriger le code pour gérer explicitement la désérialisation du même code. alors vous devrez manipuler la chose null car JSON traitera "null" comme une chaîne et l'assignera à l'objet qui fera votre objet avec le nom = "null", qui est faux.

Si vous souhaitez obtenir la même chose, vous devez étendre l'objet classe JSON et écrire votre propre implémentation.

+0

Non, JSON a une valeur explicite nulle, donc ce n'est pas due à JSON. Il est plutôt dû à tout ce qui traite les annotations JAXB, et comment il choisit de gérer les valeurs nulles des objets Java. – StaxMan

0

Note: Je suis le et je suis membre du groupe d'experts JAXB (JSR-222). EclipseLink JAXB (MOXy) offre un support natif pour JSON.Voici un exemple de la façon dont l'annotation @XmlElement peut être mis à profit pour mapper votre cas d'utilisation:

Foo

Par défaut, une mise en œuvre de JAXB ne maréchal une propriété nulle. Vous pouvez modifier ce comportement en définissant la propriété nillable sur @XmlElement à true.

package forum3938279; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
class Foo { 
     @XmlElement(nillable=true) 
     private Integer foo; 
     private Integer another_foo; 

} 

jaxb.properties

Pour spécifier Moxy comme fournisseur de JAXB vous devez inclure un fichier appelé jaxb.properties dans le même package que le modèle de domaine avec l'entrée suivante:

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory 

Démo

package forum3938279; 

import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class); 

     Foo foo = new Foo(); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.setProperty("eclipselink.media-type", "application/json"); 
     marshaller.marshal(foo, System.out); 
    } 

} 

Sortie

est inférieure à la sortie de l'exécution du code de démonstration. Les deux champs avaient des valeurs nulles. Le champ sans l'annotation @XmlElement n'a pas été appelé, et celui avec @XmlElement(nillable=true) a été appelé comme prévu dans JSON.

{ 
    "foo" : null 
} 

Pour plus d'informations

+0

pourquoi nillable et non nullable? Nil est normalement nul, ce qui est différent de null. – NimChimpsky