2017-10-24 6 views
0

Ist es möglich, Jackson zu verwenden, um eine Wertklasse (final, keine Setter) zu deserialisieren, die nur einen Konstruktor mit allen Argumenten und einen Builder hat? Ich kann die JsonDeserialize und JsonPOJOBuilder nicht verwenden, da ich versuche, ein in einer Client-Bibliothek definiertes Modell zu deserialisieren, sodass ich die Anmerkungen nicht hinzufügen kann. Kann ich den Builder für einen anderen Weg angeben?Jackson - deserialize mit Builder ohne Annotation

+0

Einfach implementieren nt your 'JsonDeserializer' – rkosegi

+0

@rkosegi Ich denke, es gibt keinen einfacheren Weg, dies zu tun, ohne im Grunde alle Feldnamen zu nummerieren und den Builder manuell aufzurufen? – gta0004

+0

Haben Sie mehrere Arten von Objekten, die deserialisiert werden müssen oder nur eines? – rkosegi

Antwort

1

Sie können versuchen, MixIn zu verwenden.

Ich habe eine Probe für Ihren Anwendungsfall erstellt:

Original-Klasse:

final class Sample { 

    final int id; 

    Sample(int id) { 
     this.id = id; 
    } 
} 

MixIn (bietet nicht-args Konstruktor mit gleicher args):

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) 
abstract class SampleMixin { 
    @JsonCreator 
    public SampleMixin(@JsonProperty("id") int id) { 
    } 
} 

Deserilaization:

ObjectMapper mapper = new ObjectMapper(); 
mapper.addMixIn(Sample.class, SampleMixin.class); 
Sample sample = mapper.readValue(json, Sample.class); 
+0

Ich habe es tatsächlich einen Schritt weitergeführt und ein '' '@JsonDeserialize (builder =. ..) '' 'auf einem MixIn und es hat funktioniert! So muss ich nicht alle Felder abbilden. Vielen Dank! – gta0004

Verwandte Themen