2016-10-14 1 views
3

Ich habe einen benutzerdefinierten Deserializer geschrieben, um nur die erforderlichen Felder mit Jackson zuzuordnen. Hier geht.Übergeben Sie ein Feld an benutzerdefinierte Deserializer-Klasse Jackson

public class GeneralDeserializer extends JsonDeserializer<GeneralDomain> { 

    @Override 
    public GeneralDomain deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException { 

     final JsonNode jsonNode = jp.getCodec().readTree(jp); 
     final Map<String, String> map = new ObjectMapper().convertValue(jsonNode, Map.class); 
     final String event = "Proxy"; 
     return new GeneralDomain(map.get("id"), event, map.get("name"), map.get("lastLogin")); 
    } 

    @Override 
    public Class<GeneralDomain> handledType() { 
     return GeneralDomain.class; 
    } 
} 

Ich habe auch eine Mixinklasse, um zusätzliche Anmerkungen hinzuzufügen.

@JsonDeserialize(using = GeneralDeserializer.class) 
public class GeneralDomainMixIn{} 

Ich hole das Objekt auf diese Weise

ObjectMapper mapper = new ObjectMapper(); 
mapper.addMixIn(GeneralDomain.class, SimpleRevealPublicEventMixIn.class); 
String json = "{\"id\": 111, \"name\": David, \"lastLogin\": \"02-10-2016 10:32:00 AM\"}"; 
GeneralDomain readValue = mapper.readValue(json, GeneralDomain.class); 

Dies funktioniert gut. Aber wie Sie im benutzerdefinierten Deserializer sehen können, codiere ich den Ereignisfeldwert hart. Dies wird von einer anderen Instanzvariable in der Hauptklasse weitergegeben. Ich muss dieses Feld an den benutzerdefinierten Deserializer übergeben. Gibt es eine Möglichkeit, auf diese Variable im Deserializer zuzugreifen? Oder gibt es einen anderen alternativen Weg, dies zu erreichen? Bitte hilf mir. Vielen Dank.

+1

Möglicherweise bereits beantwortet hier http://stackoverflow.com/questions/2713316 1/How-to-Pass-Konstruktoren-Parameter-mit-Jackson. Hilft das? –

+0

@DanielScott Entschuldigung für die verspätete Antwort. Ja, ich habe den von Ihnen geposteten Link durchsucht. Das Problem für mich ist, dass ich eine MixIn-Klasse habe, die '@ deserialize'-Annotation verwendet. Selbst wenn ich einen Konstruktor erstelle, um den Wert zu übernehmen, den ich übergeben muss, wie wird das mit der MixIn-Klasse gemacht? Kannst du es bitte erklären, wenn du es weißt? Vielen Dank – 15R6

Antwort

2

Endlich die Antwort. Danke an Philip in dieser link.

Alles, was ich tun musste, war dies.

eine Instanz InjectableValues ​​erstellen

private InjectableValues newInjectableValues() { 
    return new InjectableValues.Std() 
    .addValue("event", "proxy") 
} 

diese Methode verwenden, um die injectablevalues ​​Methode in Zuordnerklasse

GeneralDomain readValue = mapper.setInjectableValues(injectEventType()).readValue(json, GeneralDomain.class); 

In meinem deserialize Verfahren eingestellt hatte ich die Werte von den InjectableValues ​​bereitgestellt abzurufen:

String event = String.valueOf(ctxt.findInjectableValue("event", null, null)); 
Verwandte Themen