如何将一些 JSON 参数反序列化为 DTO 中的一个新变量

How to deserialize some JSON parameters as one new variable in DTO

如果某些 JSON 参数应该用于创建 Java DTO 的变量(但不被反序列化),如何将 JSON(使用 Jackson)反序列化为 Java 对象作为 dto 变量)。

例如,我有 JSON {"sideA" : 2, "sideB" : 4, "useless_parameter" : "useless_information"},我需要得到 toString(反序列化 Java 对象)的结果,例如:RectangleDto{area = 8, useless_parameter = "useless_information"}

如果我需要反序列化"useless_parameter"那么我可以使用@JsonGetter("useless_information"),那么如果我需要的话我应该用"sideA"和"sideB"做什么将面积作为RectangleDto的变量?我已经有了将 JSON 参数转换为该变量的方法。

您可以为该区域添加 @JsonProperty,并为 sideA 和 SideB 使用 @JsonIgnore。请检查 Jackson :: adding extra fields to an object in serialization

可能您需要自定义反序列化器:

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;
    }
}

然后在class

上注册解串器
@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'}