我可以有条件地使用@JsonUnwrapped吗?我不想在序列化过程中使用它,但想在反序列化对象时使用它。
一种实现方法是创建两个不同的类或创建一个子类,该子类仅覆盖需要在序列化和反序列化时表现不同的属性。这听起来不对。还有其他替代方法或Jackson的解决方法吗?
您可以使用MixIn功能。使用此要素POJO类与Jackson注释分离。您可以使用在运行时中添加必要的注释MixIn。请参见以下示例:
POJO
Jackson
MixIn
import com.fasterxml.jackson.annotation.JsonUnwrapped; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonTest { private static final String UNWRAPPED_JSON = "{\n" + " \"age\" : 13,\n" + " \"first\" : \"Huckleberry\",\n" + " \"last\" : \"Finn\"\n" + "}"; @Test public void test() throws IOException { System.out.println("### Serialize without unwrapped annotation ###"); ObjectMapper serializer = new ObjectMapper(); System.out.println(serializer.writerWithDefaultPrettyPrinter().writeValueAsString(createParent())); System.out.println("### Deserialize with unwrapped annotation ###"); ObjectMapper deserializer = new ObjectMapper(); deserializer.addMixInAnnotations(Parent.class, ParentMixIn.class); System.out.println(deserializer.readValue(UNWRAPPED_JSON, Parent.class)); } private Parent createParent() { Name name = new Name(); name.first = "Tom"; name.last = "Sawyer"; Parent parent = new Parent(); parent.setAge(12); parent.setName(name); return parent; } } class Parent { private int age; private Name name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Name getName() { return name; } public void setName(Name name) { this.name = name; } @Override public String toString() { return "Parent{" + "age=" + age + ", name=" + name + '}'; } } interface ParentMixIn { @JsonUnwrapped Name getName(); } class Name { public String first, last; @Override public String toString() { return "Name{" + "first='" + first + '\'' + ", last='" + last + '\'' + '}'; } }
上面的程序打印:
### Serialize without unwrapped annotation ### { "age" : 12, "name" : { "first" : "Tom", "last" : "Sawyer" } } ### Deserialize with unwrapped annotation ### Parent{age=13, name=Name{first='Huckleberry', last='Finn'}}