无法使用嵌套对象反序列化JSON

时间:2019-10-29 13:39:16

标签: java json deserialization

我有嵌套的对象(一个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注释,但这没有帮助。

有人可以解释这些字段的顺序吗?

0 个答案:

没有答案