使用JAX-RS(GlassFish 4)和Jackson作为序列化程序,我在反序列化Double类型的POJO属性(与Integer相同)时遇到了一个问题。

可以说我有一个简单的POJO(不包括许多其他杂项,getter和setter):

public class MapConstraints {

    private Double zoomLatitude;

    private Double zoomLongitude;
}


当用户以{ "zoomLatitude": "14.45", "zoomLongitude": ""}格式向API发送请求时,zoomLatitude的值设置为14.45,但是zoomLongitude的值设置为0

如果没有值,我希望zoomLongitude的值是null。我尝试用ObjectMapper配置JsonInclude.Include.NON_EMPTY,但是没有成功。

与genson的结果相同。

最佳答案

您可以使用@JsonInclude注释POJO,以指示哪些值将被(反)序列化:

@JsonInclude(Include.NON_EMPTY)
private Double zoomLongitude


在Jackson 2.6中,以下values可用:


ALWAYS
NON_ABSENT
NON_DEFAULT
NON_EMPTY
NON_NULL
USE_DEFAULTS


但是,如果@JsonInclude values不符合您的需求,则可以创建自定义的JsonDeserializer

public class CustomDeserializer extends JsonDeserializer<Double> {

    @Override
    public Double deserialize(JsonParser jp, DeserializationContext ctxt)
      throws IOException, JsonProcessingException {

        String text = jp.getText();
        if (text == null || text.isEmpty()) {
            return null;
        } else {
            return Double.valueOf(text);
        }
    }
}


然后用@JsonDeserialize注释您的字段,指示要使用的反序列化器:

public class MapConstraints {

    @JsonDeserialize(using = CustomDeserializer.class)
    private Double zoomLatitude;

    @JsonDeserialize(using = CustomDeserializer.class)
    private Double zoomLongitude;
}

关于java - jackson 强制为零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33548768/

10-13 03:39