Part 5: writeValueAsString(List) drops the discriminator - and the two fixes
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package com.ankurm.jackson3.part5polymorphic;
|
||||
|
||||
import tools.jackson.core.type.TypeReference;
|
||||
import tools.jackson.databind.json.JsonMapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Post: Polymorphic Deserialisation — https://ankurm.com/jackson-polymorphic-deserialization/
|
||||
* Section: "Serialising a Mixed List"
|
||||
*
|
||||
* CORRECTION TO THE POST. The post shows
|
||||
*
|
||||
* mapper.writerWithDefaultPrettyPrinter().writeValueAsString(payments)
|
||||
*
|
||||
* producing JSON that contains "paymentType". It does not. Passing a List to
|
||||
* writeValueAsString gives Jackson only the runtime class (ImmutableCollections.ListN),
|
||||
* which carries no element type, so the polymorphic type serialiser is never engaged
|
||||
* and the discriminator is silently omitted. The resulting JSON then fails to
|
||||
* deserialise — see F02DeserialiseMixedList.
|
||||
*
|
||||
* Two things do work: a typed array, or writerFor(TypeReference).
|
||||
*/
|
||||
public class F01SerialiseMixedList {
|
||||
|
||||
static List<PaymentMethod> samplePayments() {
|
||||
CreditCardPayment card = new CreditCardPayment();
|
||||
card.setPaymentId(1L);
|
||||
card.setAmountDue(99.99);
|
||||
card.setCardNumberLastFour("4242");
|
||||
card.setCardNetwork("VISA");
|
||||
|
||||
BankTransferPayment bank = new BankTransferPayment();
|
||||
bank.setPaymentId(2L);
|
||||
bank.setAmountDue(250.00);
|
||||
bank.setBankAccountIban("GB29NWBK60161331926819");
|
||||
bank.setBankName("National Bank");
|
||||
|
||||
return List.of(card, bank);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
JsonMapper mapper = JsonMapper.builder().build();
|
||||
List<PaymentMethod> payments = samplePayments();
|
||||
|
||||
System.out.println("--- 1. single element: discriminator present ---");
|
||||
System.out.println(mapper.writeValueAsString(payments.get(0)));
|
||||
|
||||
System.out.println("--- 2. BROKEN: writeValueAsString(List) drops paymentType ---");
|
||||
System.out.println(mapper.writeValueAsString(payments));
|
||||
|
||||
System.out.println("--- 3. FIX A: writerFor(TypeReference) ---");
|
||||
System.out.println(mapper.writerFor(new TypeReference<List<PaymentMethod>>() { })
|
||||
.withDefaultPrettyPrinter()
|
||||
.writeValueAsString(payments));
|
||||
|
||||
System.out.println("--- 4. FIX B: a typed array carries its component type ---");
|
||||
System.out.println(mapper.writeValueAsString(payments.toArray(new PaymentMethod[0])));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user