如果应该使用一些JSON参数来创建Java DTO的变量(但不能反序列化为dto变量),如何将JSON(使用Jackson)反序列化为Java对象。
例如,我有JSON {"sideA" : 2, "sideB" : 4, "useless_parameter" : "useless_information"}
,我需要得到toString(反序列化的Java对象)的结果,如:RectangleDto{area = 8, useless_parameter = "useless_information"}
如果我需要反序列化“useless_parameter”,那么我可以使用@JsonGetter(“useless_information”),那么如果我需要将area作为RectangleDto的变量,我应该怎么做“sideA”和“sideB”?我已经有了一个将JSON参数转换为此变量的方法。
答案 0 :(得分:0)
您可以为该区域添加@JsonProperty
,也可以将@JsonIgnore
用于sideA和SideB。请检查
Jackson :: adding extra fields to an object in serialization
答案 1 :(得分:0)
可能你需要一个自定义反序列化器:
class MyDeserializer extends StdDeserializer<RectangleDto> {
public MyDeserializer() {
this(null);
}
protected MyDeserializer(Class<?> vc) {
super(vc);
}
@Override
public RectangleDto deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
int a = node.get("sideA").intValue();
int b = node.get("sideB").intValue();
String useless_parameter = node.get("useless_parameter").asText();
RectangleDto test = new RectangleDto();
test.setArea(a * b);
test.setUseless_parameter(useless_parameter);
return test;
}
}
然后在类
上注册反序列化器@JsonDeserialize(using = MyDeserializer.class)
public class RectangleDto {
private int area;
private String useless_parameter;
// getters, setters...
}
然后这将按你的意愿工作:
RectangleDto r = mapper.readValue("{\"sideA\" : 2, \"sideB\" : 4, \"useless_parameter\" : \"useless_information\"}", RectangleDto.class);
System.out.println(r);
结果
RectangleDto{area=8, useless_parameter='useless_information'}