我有嵌套的对象(一个Parent
有一个ParentType
和一个Child
),它们先被序列化,但随后没有被适当地反序列化。我可以看到ParentType
,但是Child
为空。
免责声明:这是旧版代码,因此有很多丑陋的事情。
ParentType.java
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum ParentType {
FAT("FAT"),
SLIM("SLIM"),
NORMAL("NORMAL");
private final String type;
ParentType(String type) {
this.type = type;
}
public String getType() {
return this.toString();
}
@JsonCreator
public static ParentType fromValue(@JsonProperty("type") String text) {
return Arrays.stream(ParentType.values()).filter(b -> String.valueOf(b.type).equals(text))
.findFirst().orElse(null);
}
}
ChildDto.java (出于绝望,我到处都放置了@JsonProperty
)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ChildDto{
@JsonProperty("name")
private String name;
public ChildDto(@JsonProperty("name") String name) {
this.name= name;
}
@JsonProperty("name")
public String getName() {
return name;
}
@JsonProperty("name")
public void setName(String name) {
this.name = name;
}
}
ParentDto.java
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class AccountCreateRequestDto {
@JsonProperty("customerType")
private ParentType parentType;
@JsonProperty("child")
private ChildDto child;
public AccountCreateRequestDto(
@JsonProperty("parentType") ParentType accountType,
@JsonProperty("child") ChildDto child) {
this.accountType = accountType;
this.child = child;
}
@JsonProperty("parentType")
public ParentType getParentType () {
return parentType;
}
@JsonProperty("child")
public ChildDto getChild() {
return child;
}
@JsonProperty("parentType")
public void setParentType (ParentType accountType) {
this.parentType = parentType;
}
@JsonProperty("child")
public void setChild(ChildDto child) {
this.child = child;
}
}
MyTest.java
@Test
public void test() throws IOException {
String name = "Jack";
ChildDto child = new ChildDto(name);
ParentDto toSerialize = new ParentDto(ParentType.FAT, child);
String serializedValue = new ObjectMapper().writeValueAsString(toSerialize);
ParentDto deserialized = new ObjectMapper().readValue(serializedValue, ParentDto.class);
System.out.println(serializedValue);
System.out.println(deserialized.getParentType().getType());
System.out.println(deserialized.getChild().getName());
}
在最后一行,它给了我NPE,因为getChild()
返回null。
但是,我注意到System.out.println(serializedValue)
打印出以下内容:
{"parentType":{"type":"FAT"},"child":{"name":"Jack"}}
如果我创建一个带有反向字段的新字符串:
String s1="{\"child\":{\"name\":\"Jack\"},\"parentType\":{\"type\":\"FAT\"}}";
...然后尝试反序列化:
ParentDto deserialized1 = new ObjectMapper().readValue(s1, ParentDto.class);
...它正常工作,并且所有字段都正确读取。
我还尝试实现Serializable
并使用@JsonPropertyOrder
注释,但这没有帮助。
有人可以解释这些字段的顺序吗?