Maison >Java >javaDidacticiel >Comment utiliser un sérialiseur personnalisé avec Jackson ?
Pour personnaliser la sérialisation d'une classe Java à l'aide de Jackson, on peut définir un sérialiseur personnalisé qui étend le JsonSerializer classe.
1. Créez un sérialiseur personnalisé pour l'article :
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.createdBy.id); jgen.writeEndObject(); } }
2. Créez un module de sérialisation personnalisé et enregistrez le sérialiseur :
ObjectMapper mapper = new ObjectMapper(); SimpleModule simpleModule = new SimpleModule("SimpleModule", new Version(1,0,0,null)); simpleModule.addSerializer(new ItemSerializer()); mapper.registerModule(simpleModule);
3. Sérialiser l'objet article :
StringWriter writer = new StringWriter(); mapper.writeValue(writer, myItem);
L'erreur rencontrée lors de l'enregistrement du sérialiseur personnalisé (java.lang.IllegalArgumentException : JsonSerializer de type ... ne définit pas de valeur valide handledType()) indique que le sérialiseur ne spécifie pas le type qu'il gère.
Pour résoudre ce problème, assurez-vous que l'implémentation de JsonSerializer définit correctement sa méthode handledType().
Une approche alternative consiste à annoter un champ avec @ JsonSerialize(using = CustomSerializer.class) pour utiliser un sérialiseur spécifique.
Pour personnaliser la sérialisation des dates, créez un sérialiseur personnalisé qui étend SerializerBase :
public class CustomDateSerializer extends SerializerBase<Date> { public CustomDateSerializer() { super(Date.class, true); } @Override public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'ZZZ (z)"); String format = formatter.format(value); jgen.writeString(format); } }
Et puis ajoutez l'annotation au champ :
@JsonSerialize(using = CustomDateSerializer.class) private Date createdAt;
Cela permet pour un contrôle détaillé du processus de sérialisation et de désérialisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!