使用 JsonUnwrapped 时,Jackson 可以同时接受 wrapped 和 unwrapped Json

Can Jackson accept both wrapped and unwrapped Json when using JsonUnwrapped

我有一个 class 这样的:

...
@JsonUnwrapped
private DataObject dataObject;
...

数据对象是

@Getter
public class DataObject {
    private String nested1;
    private String nested2;
}

显然,如果我的 Json 输入是

,这将起作用
{
   "nested1" : "nestedValue1", 
   "nested2" : "nestedValue2"
}

有没有办法让它变得灵活,以便它可以接受两个版本? 但是,如果我希望它也能够接受

怎么办?
{
   "dataObject: {
      "nested1" : "nestedValue1", 
      "nested2" : "nestedValue2"
   }
}

从下面的 your previous question 中获取您的 TestContract class 的代码:

public class TestContract {
    private String field1;

    @JsonUnwrapped
    private DataObject dataObject;
}

解决该问题的一种方法是为您的 TestContract class 编写自定义反序列化程序,它将使用以下 lombok 注释和 @JsonDeserialize 注释:

@Getter
@Setter
@ToString
@NoArgsConstructor
@JsonDeserialize(using = TestContractDeserializer.class)
public class TestContract {
    private String field1;

    @JsonUnwrapped
    private DataObject dataObject;
}

自定义反序列化器将检查 field1 属性,然后检查 nested1nested2 两个属性是否嵌套在 [=19= 中] 属性 涵盖您提出的两种情况:

public class TestContractDeserializer extends JsonDeserializer<TestContract> {

    @Override
    public TestContract deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        //read the field1 property
        String field1 = node.get("field1").asText();
        JsonNode dataObjectNode = node.get("dataObject");
        //check if properties are nested or not
        if (dataObjectNode != null) {
            node = dataObjectNode;
        }
        String nested1 = node.get("nested1").asText();
        String nested2 = node.get("nested2").asText();
        DataObject dataObject = new DataObject();
        dataObject.setNested1(nested1);
        dataObject.setNested2(nested2);
        TestContract testContract = new TestContract();
        testContract.setDataObject(dataObject);
        testContract.setField1(field1);
        return testContract;
    }
}