J'ai deux classes Java que je souhaite sérialiser en JSON à l'aide de Jackson:
public class User {
public final int id;
public final String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
}
public class Item {
public final int id;
public final String itemNr;
public final User createdBy;
public Item(int id, String itemNr, User createdBy) {
this.id = id;
this.itemNr = itemNr;
this.createdBy = createdBy;
}
}
Je souhaite sérialiser un élément dans ce JSON:
{"id":7, "itemNr":"TEST", "createdBy":3}
avec l'utilisateur sérialisé pour inclure uniquement le fichier id. Je pourrai également sériliser tous les objets utilisateur en JSON comme:
{"id":3, "name": "Jonas", "email": "jonas@example.com"}
Je suppose donc que j'ai besoin d'écrire un sérialiseur personnalisé Itemet d'essayer ceci:
public class ItemSerializer extends JsonSerializer<Item> {
@Override
public void serialize(Item value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
jgen.writeStartObject();
jgen.writeNumberField("id", value.id);
jgen.writeNumberField("itemNr", value.itemNr);
jgen.writeNumberField("createdBy", value.user.id);
jgen.writeEndObject();
}
}
Je sérialise le JSON avec ce code de Jackson How-to: Custom Serializers :
ObjectMapper mapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule("SimpleModule",
new Version(1,0,0,null));
simpleModule.addSerializer(new ItemSerializer());
mapper.registerModule(simpleModule);
StringWriter writer = new StringWriter();
try {
mapper.writeValue(writer, myItem);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Mais j'obtiens cette erreur:
Exception in thread "main" java.lang.IllegalArgumentException: JsonSerializer of type com.example.ItemSerializer does not define valid handledType() (use alternative registration method?)
at org.codehaus.jackson.map.module.SimpleSerializers.addSerializer(SimpleSerializers.java:62)
at org.codehaus.jackson.map.module.SimpleModule.addSerializer(SimpleModule.java:54)
at com.example.JsonTest.main(JsonTest.java:54)
Comment puis-je utiliser un sérialiseur personnalisé avec Jackson?
Voici comment je le ferais avec Gson:
public class UserAdapter implements JsonSerializer<User> {
@Override
public JsonElement serialize(User src, java.lang.reflect.Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(src.id);
}
}
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(User.class, new UserAdapter());
Gson gson = builder.create();
String json = gson.toJson(myItem);
System.out.println("JSON: "+json);
Mais je dois le faire avec Jackson maintenant, puisque Gson ne prend pas en charge les interfaces.
Item? J'ai un problème où ma méthode de contrôleur renvoie un objet sérialisé standardTypeA, mais pour une autre méthode de contrôleur spécifique, je veux le sérialiser différemment. À quoi cela ressemblerait-il?