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).