- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我在嵌套字段上使用@JsonUnwrapped
时:
public class Person{
private int id;
@JsonUnwrapped
private Father father
//getters/setters
@Data
@AllArgsConstructor
private static class Father {
private String name;
private String surname;
}
同时我使用@JsonCreator
:
@JsonCreator // DESERIALIZATION: JSON -> POJO
public Person(...
@JsonProperty("name") String name,
@JsonProperty("surname") String surname) {
(...)
this.father = new Father(name, surname);
其中 Father
是嵌套类。
我收到错误:
Father` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creat
但是当我删除 @JsonUnwrapped
时,该字段可以正常反序列化,但在序列化过程中不会变平。如何保证Father字段同时被序列化和反序列化扁平化?
编辑:
我粘贴完整代码:
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Person {
private int id;
private String firstName;
private String lastName;
private boolean active;
private Address address;
private String[] languages;
@JsonIgnore private boolean isTheKing;
@JsonUnwrapped // SERIALIZATIONL POJO -> JSON
private Father father;
@JsonCreator // DESERIALIZATION: JSON -> POJO
public Student(
@JsonProperty("id") int id,
@JsonProperty("firstName") String firstName,
@JsonProperty("lastName") String lastName,
@JsonProperty("active") boolean active,
@JsonProperty("address") Address address,
@JsonProperty("languages") String[] languages,
@JsonProperty("isTheKing") boolean isTheKing,
@JsonProperty("name") String name,
@JsonProperty("surname") String surname) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.active = active;
this.address = address;
this.languages = languages;
this.isTheKing = isTheKing;
this.father = new Father(name, surname);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String[] getLanguages() {
return languages;
}
public void setLanguages(String[] languages) {
this.languages = languages;
}
public Father getFather() {
return father;
}
public void setFather(Father father) {
this.father = father;
}
@Data
@AllArgsConstructor
static class Father {
private String name;
private String surname;
}
}
以下主要方法失败:
ObjectMapper mapper = new ObjectMapper();
Person myStudent =
mapper.readValue(new File("src/main/resources/data/rest/studentIN.json"), Person.class);
System.out.println(myStudent);
有错误:
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of
com.example.demo.Person$Father
(no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
我使用 Lombok :
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
最佳答案
它应该适用于简单的POJO
模型。 Father
类应该是 public
:
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
Person.Father father = new Person.Father();
father.setName("Wit");
father.setSurname("Pil");
Person person = new Person();
person.setId(1909);
person.setFather(father);
String json = mapper.writeValueAsString(person);
System.out.println(json);
System.out.println(mapper.readValue(json, Person.class));
}
}
class Person {
private int id;
@JsonUnwrapped
private Father father;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Father getFather() {
return father;
}
public void setFather(Father father) {
this.father = father;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", father=" + father +
'}';
}
static class Father {
private String name;
private String surname;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
@Override
public String toString() {
return "Father{" +
"name='" + name + '\'' +
", surname='" + surname + '\'' +
'}';
}
}
}
上面的代码打印:
{
"id" : 1909,
"name" : "Wit",
"surname" : "Pil"
}
Person{id=1909, father=Father{name='Wit', surname='Pil'}}
自 2.6.7
以来,我已经对它的多个版本进行了测试,并且运行良好。
关于java - @JsonUnwrapped 和 @JsonCreate 对于同一字段会导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55130687/
我有一个 POJO,例如 public class Category { public Collection items; public static class Item {
我正在使用 Jackson将 JSON 字符串反序列化为枚举。 public enum RoomType { SHARED("shared"), PRIVATE("private");
初始问题 是否可以有多个 @JsonCreator 方法,并让 jackson 根据方法定义检测应该使用哪一个? @JsonCreator public static StateOfComm fact
我正在尝试使用 Jackson 将一些 JSON 转换为一个类的实例,该类包含一些简单的字符串和另一个我正在使用 @JsonCreator 的类。看来 Jackson 无法创建其他类的实例。 问题是当
我正在尝试使用 jackson 将 json 反序列化为枚举。如果工厂方法只有一个参数,它工作正常。一旦我们添加更多参数,它就会停止工作。 这是我试过的代码示例。 public enum Test {
我正在尝试使用 Jackson 1.9.10 反序列化此类的一个实例: public class Person { @JsonCreator public Person(@JsonProperty("
我在使 RestEasy (3.0.10.Final) 将路径参数解析为枚举值时遇到问题。 有了枚举定义... package com.stines; import com.fasterxml.jac
我想使用主要构造函数用 @JsonCreator 进行注释,如下所示: // error @JsonCreator class User( @JsonProperty("username")
我在构造函数的参数上使用Jackson @JsonProperty(name) 注释,我遇到的每个文档都指出我们必须使用@JsonCreator 注释和@JsonProperty 才能正常工作,但即使
我很想用这个: @Getter @ToString @RequiredArgsConstructor(onConstructor_ = {@JsonCreator(mode =
我正在编写一个简单的 REST API,它将在给定主机名上安装/启动/停止代理。作为 API 的一部分,我正在创建一个 AgentInstruction 实例(代码如下)。由于某种原因,应用程序抛出
当我在嵌套字段上使用@JsonUnwrapped时: public class Person{ private int id; @JsonUnwrapped private F
我正在使用带有 JavaConfig 和 Jackson 2.4.3 的 Spring 4.1.1。 我的 Controller 看起来像这样: @RestController public inte
Jackson 似乎使用反射将附加属性直接写入字段,即使 @JsonCreator使用了构造函数,该字段标记为 final . 例子: public class Test { static c
我有以下实体,我将其用作对 Controller 的请求之一的目标 POJO: Entity @Table(name="user_account_entity") @JsonIgnorePropert
我正在使用 Jackson 序列化/反序列化不可变的 POJO。因为 POJO 是不可变的,所以我这样定义它们: class Foo { private final String bar;
我目前正在使用 Jackson 1.4.2 并尝试反序列化从我们的 UI 传回 Java Controller (Servlet) 的 code 值(类型信息的唯一标识符)。 有多种类型(例如 ABC
我有一个 Value 类,它包含一个值: public class Value { protected final Object value; @JsonValue publi
我有一些运行良好的旧代码,但现在我想在域对象中使用@JsonCreator,并且我能够重构所有内容,但我现在陷入了一个问题。在一种情况下,我的 Json 结构如下: [{ "name" :
我有一个包含很多字段的可序列化对象,其中一些是强制性的,其他是可选的。为了使这个对象易于使用,我尝试了 Builder Pattern with a Twist 。这很有效,但是生成的某些 Build
我是一名优秀的程序员,十分优秀!