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?
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
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"}}
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)