27 votes

Comment réutiliser le Maillot du JSON/JAXB pour la sérialisation?

J'ai un JAX-RS RESTE service mis en place à l'aide de Jersey. Une des fonctionnalités intéressantes de JAX-RS/Jersey est comment facilement un POJO peut être transformé en un service REST, simplement en les saupoudrant d'un peu d'annotations Java... y compris un trivial mécanisme de conversion des Pojo de JSON à l'aide des annotations JAXB.

Maintenant, je voudrais être en mesure de prendre avantage de ce cool JSON-la ratification de la fonctionnalité pour les non-REPOS fins - j'aimerais tout simplement pouvoir sérialiser certains de ces objets sur le disque, comme JSON texte. Voici un exemple JAXB objet que je veux pour sérialiser:

@XmlRootElement(name = "user")
public class UserInfoImpl implements UserInfo {

    public UserInfoImpl() {} 

    public UserInfoImpl(String user, String details) {
        this.user = user;
        this.details = details;
    }

    public String getUser() { return user; }
    public void setUser(String user) { this.user = user; }

    public String getDetails() { return details; }
    public void setDetails(String details) { this.details = details; }

    private String user;
    private String details;
}

Jersey peuvent tourner l'un de ces en json avec aucune autre info. Je me demandais si Jersey a exposé à cette fonction dans l'API pour les besoins comme le mien? Je n'ai pas eu la chance de trouver si loin...

Merci!

Mise à JOUR 2009-07-09: j'ai appris que je peux utiliser les Fournisseurs de l'objet à presque faire exactement ce que je veux:

  @Context Providers ps;
  MessageBodyWriter uw = ps.getMessageBodyWriter(UserInfoImpl.class, UserInfoImpl.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE);

  uw.writeTo(....)

... Ce qu'écrit l'objet json pour tout outputstream, ce qui serait parfait pour moi, mais je ne peux obtenir les Prestataires de l'objet à l'aide de @Contexte à partir d'un @Component object. Personne ne sait comment y accéder à partir d'un régulier, onu-annoté POJO? Merci!

19voto

Andy O Points 306

Jersey utilise un couple de cadres différents, selon que vous utilisez mappé(), badgerfish () ou naturels() notation. Naturel est généralement l'une des personnes veulent. Et c'est implémentée à l'aide de la très bonne (et très rapide), autonome Jackson JSON processeur, je crois, qui va de l'Objet->JAXB->JSON. Cependant Jackson fournit également son propre JAX-RS fournisseur pour aller d'Objet direct->JSON.

En fait, ils ont même ajouté le support pour les annotations JAXB. Jetez un oeil à

http://wiki.fasterxml.com/JacksonJAXBAnnotations

Je pense que c'est finalement ce que vous cherchez. Jackson fait l'Objet<->JSON traitement...Maillot est tout simplement l'appelle pour vous

6voto

Ondra Žižka Points 8262

Voici un simple exemple de l'utilisation de JAXB pour les objets de la carte en JSON (à l'aide de Jackson):

http://ondra.zizka.cz/stranky/programovani/java/jaxb-json-jackson-howto.texy

4voto

RimasK Points 71
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(pojoObject);

3voto

ramon_salla Points 708

Annotations JAXB, beau travail lors de la sérialisation XML. Le principal problème est que JAXB ne prend pas en charge les tableaux vides. Donc, lors de la sérialisation quelque chose comme ça...

List myArray = new ArrayList();

...en json via jaxb anottations tous vos tableaux vides devenir null au lieu de [].

Pour résoudre ce problème, vous pouvez simplement sérialiser vos objets pojo directement en json via jackson.

Jetez un oeil à cette depuis Jersey guide de l'utilisateur de: http://jersey.java.net/nonav/documentation/latest/user-guide.html#d0e1959

C'est la meilleure façon d'utiliser Jackson fournisseur, sans JAXB. En outre, vous pouvez toujours utiliser la dernière version de jackson par downlaoding jackson-toutes-x.y.z-jar à partir de son site web.

Cette méthode ne sera pas interférer avec votre annotations jaxb je vous suggère d'essayer!

1voto

Jack Cox Points 2275

Depuis Jersey est une implémentation de référence de JAX-RS et JAX-RS est complètement concentré sur la fourniture d'un moyen standard de mise en œuvre de la fin pour le RESTE les questions de la sérialisation de la charge utile est laissée à d'autres normes.

Je pense que si ils inclus sérialisation d'un objet dans le JAX-RS standard, il devient rapidement un grand multi-tête de la bête qui serait difficile à mettre en œuvre et de perdre un peu de son orientation.

J'apprécie la façon ciblée Jersey est sur la prestation de propre et simple à utiliser RESTE des points de terminaison. Dans mon cas, j'ai juste sous-classé un parent qui a toutes les JAXB de plomberie, de façon à l'ordonnancement des objets entre le binaire et le XML est très propre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X