使用 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
属性,然后检查 nested1
和 nested2
两个属性是否嵌套在 [=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;
}
}
我有一个 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
属性,然后检查 nested1
和 nested2
两个属性是否嵌套在 [=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;
}
}