Nous avions déjà vu comment sérialiser des objets en XML en utilisant des annotations, il est également possible de sérialiser/désérialiser des Javabeans en JSON en quelques lignes avec Jackson. Nous pouvons isoler ces lignes de code dans une classe JsonSerializer :
public class JsonSerializer implements Serializer
{
private ObjectMapper om = new ObjectMapper();public void serialize(OutputStream os, Object o) throws IOException
{
serialize(new OutputStreamWriter(os), o);
}public void serialize(Writer writer, Object o) throws IOException
{
try
{
om.writeValue(writer, o);
} catch (JsonMappingException e)
{
System.out.println(e.getMessage());
}
}public <T> T deserialize(Reader reader, Class<T> clazz) throws IOException
{
return om.readValue(reader, clazz);
}
}
Maintenant, dans un Service ou un Adapter Android, nous pouvons lire/écrire nos Javabeans dans des flux JSON :
JsonSerializer js = new JsonSerializer();
// exemple de sérialisation
js.serialize(flux, new Person("Florent", "Cappelle")
{{
setTels(Arrays.<Tel>asList(new Tel("012345678", Tel.HOME_LANDLINE)));
setTels(Arrays.<Tel>asList(new Tel("062345678", Tel.MOBILE_LINE)));
}});
// désérialisation
Person result = js.deserialize(reader, Person.class);
Le mécanisme de sérialisation utilise les noms des getters et les valeurs qu’ils retournent pour générer le flux JSON. Les collections et tableaux sont convertis en leurs équivalents en JSON, ce qui donne par exemple :
{“adresses”:[],”emails”:[], “firstname”:”Florent”, name:”Cappelle”, “tels”:[“number”:”0612345678”, “type”:1]}
Il est possible d’ignorer certains getters en les annotant avec @JsonIgnore et il existe d’autres annotations pour adapter vos Javabeans avec un format JSON prédéfini.
Jackson est donc un choix pertinent pour la stack de développement Google étant donné qu’il fonctionne aussi sur Google App Engine (sans avoir à le modifier contrairement à XStream).
À noter aussi que Jackson fournit des providers pour JAX-RS ainsi qu’une API bas niveau (et donc plus rapide).
