web-dev-qa-db-fra.com

Java.Util.map à l'objet JSON avec Jersey / Jaxb / Jackson

J'ai essayé de créer un maillot REST Webservice. Je veux recevoir et émettre des objets JSON de Java classes comme ci-dessous:

@XmlRootElement
public class Book {

    public String code;

    public HashMap<String, String> names;

}

Cela devrait être converti en Json comme ceci:

{
    "code": "ABC123",
    "names": {
        "de": "Die fabelhafte Welt der Amelie",
        "fr": "Le fabuleux destin d'Amelie Poulain"
    }
}

Cependant, je ne trouve pas de solution standard pour cela. Tout le monde semble mettre en œuvre son propre wrappersolution . Cette exigence me semble extrêmement basique pour moi; Je ne peux pas croire que c'est la solution généralement acceptée à cela, d'autant plus que Jersey est vraiment l'une des parties les plus amusantes de Java.

J'ai aussi essayé de passer à Jackson 1.8 qui ne me donne que cela, ce qui est extrêmement obscurci JSON:

{
    "code": "ABC123",
    "names": {
        "entry": [{
            "key": "de",
            "value": "Die fabelhafte Welt der Amelie"
        },
        {
            "key": "fr",
            "value": "Le fabuleux destin d'Amelie Poulain"
        }]
    }
}

Y a-t-il des solutions proposées à cela?

26
samy-delux

Je ne sais pas pourquoi ce n'est pas le réglage par défaut, et cela m'a fallu un moment, mais si vous souhaitez convertir JSON avec Jersey, ajoutez

    <init-param>
        <param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

à votre web.xml et tous vos problèmes devraient être résolus.

PS: Vous devez également vous débarrasser de la @XmlRootElement annotations pour le faire fonctionner

24
Jan

Vous pouvez utiliser Google-gson . Voici un exemple de code:

    @Test
    public void testGson(){
       Book book = new Book();
       book.code = "1234";
       book.names = new HashMap<String,String>();
       book.names.put("Manish", "Pandit");
       book.names.put("Some","Name");
       String json = new Gson().toJson(book);
       System.out.println(json);
   }

La sortie est {"code":"1234","names":{"Some":"Name","Manish":"Pandit"}}

7
lobster1234

Je sais que cela a été posé il y a longtemps, mais les choses ont changé de temps moyen, alors pour le dernier maillot V2.22 qui n'en a plus pas le package com.sun.jerey , ces deux dépendances ajoutées dans le projet pom.xml ont résolu le même problème:

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>2.22</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.5.4</version> <!-- jackson version used by jersey v2.22 -->
</dependency>

Pas besoin d'ajouter quoi que ce soit dans web.xml . La première dépendance instruira Jersey à utiliser Jackson pour les transformations JSJO pour JSON. Deuxième dépendance enregistrera Jackson comme fournisseur Jersey JSON.

Aussi pour le problème null à Pojo, ajoutez cette annotation à la classe Pojo:

@JsonInclude(JsonInclude.Include.NON_NULL)
4
Lotzy