Je peux facilement convertir (désérialiser) Json string-> Java object
dans Jackson, mais j'ai besoin d'obtenir certaines propriétés sous forme de chaîne JSON.
Le but est d'avoir une propriété magique (appelons-la ici payload) qui peut contenir n'importe quoi, et que vous voulez la restaurer avec le type de données (FQCN) défini dans une autre propriété.
Jackson a un @ JsonValue
qui traite les chaînes JSON telles qu'elles sont, mais cela n'est valable que pour la sérialisation. Malheureusement, il n'est pas applicable pour la désérialisation.
La solution de contournement consiste à implémenter votre propre JsonDeserializer
et à spécifier le processus de désérialisation individuellement avec @ JsonDeserialize
. Cependant, le but est "Je veux obtenir la chaîne JSON telle quelle", donc l'implémentation de JsonDeserializer
est très simple.
JsonRawValueDeserializer.java
package com.example.jacksondemo;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
//★ Point 1
public class JsonRawValueDeserializer extends JsonDeserializer<String> {
//★ Point 2
@Override
public String deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
return parser.readValueAsTree().toString();
}
}
MyModel.java
package com.example.jacksondemo;
import java.io.Serializable;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
public class MyModel implements Serializable {
private static final long serialVersionUID = 1L;
//★ Point 3
// I want json raw text!
@JsonDeserialize(using = JsonRawValueDeserializer.class)
private String payload;
// these property are auto mapped by jackson (without special operation)
private String fqcn;
private Integer priority;
private String messageId;
// constructor, setter, getter omitted
}
** ★ Point 1 **
Héritez de la classe com.fasterxml.jackson.databind.JsonDeserializer
et définissez votre propreJsonDeserializer
.
Pour le paramètre type, spécifiez le type du résultat du processus de désérialisation, c'est-à-dire «String» cette fois.
** ★ Point 2 **
Implémentez pour remplacer la méthode deserialize
et renvoyer une chaîne JSON.
** ★ Point 3 **
Dans la classe Java qui mappe JSON, ajoutez l'annotation @ JsonDeserialize
à la propriété pour laquelle vous souhaitez mapper la valeur telle quelle.
Attribut ʻUse★ Spécifiez le
JsonDeserializer` original implémenté au point 1.
Désormais, même si la propriété JSON payload
est un objet, cette chaîne JSON sera stockée telle quelle dans la propriété Stringpayload
.
Pour atteindre cet objectif, regardez la propriété dqcn
pour identifier le type de données, puis désérialisez la valeur String de la propriété payload
avec le type de données souhaité.
Cette fois, j'ai expliqué comment obtenir certaines propriétés sous forme de chaîne JSON en désérialisant Jackson.
Jackson a une fonction appelée JsonNode
qui lit Json sous forme de données arborescentes, mais je pense qu'il existe de nombreuses façons de mapper Json et Java. À ce moment-là, si vous constatez que seules certaines propriétés restent comme Json, veuillez essayer cette utilisation.
Recommended Posts