Accueil > Non classé > Quelle API pour convertir des objets Java en JSON ? Partie 4

Quelle API pour convertir des objets Java en JSON ? Partie 4

La 4ème partie de cette série d’articles sur les librairies JSON porte sur Jackson.

Jackson est une librairie JSON très complète (plus de 250 classes !) et bien documentée. Pour info, les frameworks Jersey et RESTEasy s’appuient sur Jackson pour générer du JSON à partir de beans possédant des annotations JAXB.

Maven snippet :

<dependency>
	<groupId>org.codehaus.jackson</groupId>
	<artifactId>jackson-mapper-asl</artifactId>
	<version>1.9.3</version>
</dependency>

Attention, Jackson est proposée sous 2 licences différentes : ASL et LGPL. Pour savoir laquelle choisir, c’est par ici.

Jackson est une librairie modulaire. Seul le jar jackson-core est indispensable, mais il doit être utilisé conjointement avec d’autres jars en fonction des besoins. Par exemple, pour convertir des objets Java en JSON et inversement, il faut également ajouter le jar jackson-mapper dans le classpath.

Dans les exemples qui suivent, nous utilisons toujours le même objet User défini dans l’article sur json.org.

JSON to Java

Jackson est plus stricte que json.org, Json-lib et XStream concernant la syntaxe du JSON. Si les clés ne sont par entourées de double quotes, une JsonParseException est levée.

String json = "{\"User\":{\"login\":\"admin\",\"password\":\"123456\"}}";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);

Ce code ne fonctionne pas avec l’objet User tel qu’il a été défini dans l’article sur json.org. Ceci est dû au fait que je ne peux pas utiliser l’option WRAP_ROOT_VALUE lors de la désérialisation car comme le dit la javadoc, cette option n’a pas encore été implémentée dans Jackson. Pour contourner le problème, j’utilise l’objet User suivant :

public class User {

	private String login;
	private String password;

	@JsonProperty("User")
	private User user;

	public User() {
	}

	public User(String login, String password) {
		this.login = login;
		this.password = password;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.login = user.getLogin();
		this.password = user.getPassword();
	}

	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

	public String toString() {
		return "User [login=" + login + ", password=" + password + "]";
	}
}

Java to JSON

User user = new User("admin", "123456");
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
Writer strWriter = new StringWriter();
mapper.writeValue(strWriter, user);
String json = strWriter.toString();
// imprime {"User":{"login":"admin","password":"123456"}}
System.out.println(json);

L’option WRAP_ROOT_VALUE ayant été implémentée pour la sérialisation, je n’ai pas besoin de modifier l’objet User. J’utilise celui qui a été défini dans l’article sur json.org. De plus, l’avantage par rapport à Json-lib et json.org est que je n’ai pas besoin de passer les attributs de l’objet User dans une map.

Bilan

Jackson est une librairie complète mais modulaire, ce qui évite d’avoir des jars inutiles dans le classpath. Le nom des méthodes est plus intuitif qu’avec XStream. De plus, d’après cet article, c’est la librairie JSON qui possède les meilleures performances.

  1. Pas encore de commentaire
  1. Pas encore de trackbacks