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

时间:2018-01-31 11:41:59

标签: java json jackson json-deserialization

如果应该使用一些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参数转换为此变量的方法。

2 个答案:

答案 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'}