Próbuję serializować niezmienne POJO do iz JSON, używając Jackson 2.1.4, bez konieczności pisania niestandardowego serializera i z jak najmniejszą liczbą adnotacji. Chciałbym również uniknąć konieczności dodawania niepotrzebnych modułów pobierających lub domyślnych konstruktorów tylko po to, aby zadowolić bibliotekę Jacksona.Immutable/polimorficzny POJO <-> Serializacja JSON z Jacksonem
Jestem teraz zatrzymany na wyjątek:
JsonMappingException: Brak odpowiedniego konstruktora znalezionego na typ [prostego typu, klasy Circle]: nie można utworzyć wystąpienia z obiektu JSON (trzeba dodać/włączyć informacje o typie?)
Kod:
public abstract class Shape {}
public class Circle extends Shape {
public final int radius; // Immutable - no getter needed
public Circle(int radius) {
this.radius = radius;
}
}
public class Rectangle extends Shape {
public final int w; // Immutable - no getter needed
public final int h; // Immutable - no getter needed
public Rectangle(int w, int h) {
this.w = w;
this.h = h;
}
}
Kod testu:
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); // Adds type info
Shape circle = new Circle(10);
Shape rectangle = new Rectangle(20, 30);
String jsonCircle = mapper.writeValueAsString(circle);
String jsonRectangle = mapper.writeValueAsString(rectangle);
System.out.println(jsonCircle); // {"@class":"Circle","radius":123}
System.out.println(jsonRectangle); // {"@class":"Rectangle","w":20,"h":30}
// Throws:
// JsonMappingException: No suitable constructor found.
// Can not instantiate from JSON object (need to add/enable type information?)
Shape newCircle = mapper.readValue(jsonCircle, Shape.class);
Shape newRectangle = mapper.readValue(jsonRectangle, Shape.class);
System.out.println("newCircle = " + newCircle);
System.out.println("newRectangle = " + newRectangle);
Każda pomoc jest bardzo ceniona, dzięki!
Wyglądał obiecująco, ale teraz pojawia się następujący wyjątek zamiast: JsonMappingException: Argument # 0 konstruktora [konstruktora Circle, adnotacji {interfejsu [email protected]son .annotation.JsonCreator()}] nie ma adnotacji do nazwy właściwości; musi mieć nazwę, gdy konstruktor składający się z wielu parami jest opisany jako Creator – hammarback
Mimo że adnotacja @JsonProperty jest obecna? – nutlike
Tak, jak w twoim przykładzie. We wszystkich argumentach konstruktora. – hammarback