Part 3: @JsonCreator, plus @JsonUnwrapped and @JsonAnyGetter/Setter
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
package com.ankurm.jackson3.part3annotations;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonAnyGetter;
|
||||
import com.fasterxml.jackson.annotation.JsonAnySetter;
|
||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.annotation.JsonUnwrapped;
|
||||
import tools.jackson.databind.json.JsonMapper;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Post: Jackson Annotations Cheat Sheet — https://ankurm.com/jackson-annotations-guide/
|
||||
* Sections: "@JsonCreator", plus @JsonUnwrapped which the post's table lists but
|
||||
* never demonstrates. @JsonAnyGetter/@JsonAnySetter are beyond the post entirely.
|
||||
*/
|
||||
public class D04CreatorsAndUnwrapping {
|
||||
|
||||
/** Immutable class with no setters: the creator tells Jackson how to build it. */
|
||||
public static class ImmutablePoint {
|
||||
private final double xCoordinate;
|
||||
private final double yCoordinate;
|
||||
|
||||
@JsonCreator
|
||||
public ImmutablePoint(@JsonProperty("x") double xCoordinate,
|
||||
@JsonProperty("y") double yCoordinate) {
|
||||
this.xCoordinate = xCoordinate;
|
||||
this.yCoordinate = yCoordinate;
|
||||
}
|
||||
@JsonProperty("x") public double getXCoordinate() { return xCoordinate; }
|
||||
@JsonProperty("y") public double getYCoordinate() { return yCoordinate; }
|
||||
@Override public String toString() {
|
||||
return "ImmutablePoint(x=" + xCoordinate + ", y=" + yCoordinate + ")";
|
||||
}
|
||||
}
|
||||
|
||||
public record Address(String street, String city) { }
|
||||
|
||||
/** @JsonUnwrapped flattens the nested object into the parent's JSON object. */
|
||||
public static class Customer {
|
||||
public String customerName;
|
||||
@JsonUnwrapped public Address address;
|
||||
public Customer() { }
|
||||
public Customer(String n, Address a) { customerName = n; address = a; }
|
||||
}
|
||||
|
||||
/** Any unmapped properties land in a Map instead of being dropped. */
|
||||
public static class FlexiblePayload {
|
||||
public String knownField;
|
||||
private final Map<String, Object> extras = new LinkedHashMap<>();
|
||||
@JsonAnyGetter public Map<String, Object> extras() { return extras; }
|
||||
@JsonAnySetter public void put(String k, Object v) { extras.put(k, v); }
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
JsonMapper mapper = JsonMapper.builder().build();
|
||||
|
||||
ImmutablePoint point = mapper.readValue("{\"x\":3.5,\"y\":7.2}", ImmutablePoint.class);
|
||||
System.out.println("creator : " + point);
|
||||
System.out.println("round-trip: " + mapper.writeValueAsString(point));
|
||||
|
||||
System.out.println("unwrapped : " + mapper.writeValueAsString(
|
||||
new Customer("Alice", new Address("123 Main St", "Springfield"))));
|
||||
|
||||
FlexiblePayload flexible = mapper.readValue(
|
||||
"{\"knownField\":\"a\",\"surprise\":1,\"another\":[true,false]}", FlexiblePayload.class);
|
||||
System.out.println("any-setter: " + flexible.extras());
|
||||
System.out.println("any-getter: " + mapper.writeValueAsString(flexible));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user