【问题标题】:Jackson coercing to zero杰克逊强迫归零
【发布时间】:2015-11-05 15:38:38
【问题描述】:

使用 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。我尝试用JsonInclude.Include.NON_EMPTY 配置ObjectMapper 但没有成功。

与 genson 的结果相同。

【问题讨论】:

  • 如果zoomLongitude 为空或者不介意不序列化,是否要将zoomLongitude 序列化为null
  • 发送"" 的用户应该会收到错误消息,因为您的 API 使用错误。
  • 是否为 null 或未序列化无关紧要(默认 pojo 值为 null)。我知道空值“”是无效的,但是客户端框架会收集 UI 中显示的值,如果用户不输入值,则会发送一个空值。
  • 试试Include.NON_DEFAULT而不是Include.NON_EMPTY
  • Include.NON_DEFAULT 没有帮助

标签: java json jackson jax-rs


【解决方案1】:

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

@JsonInclude(Include.NON_EMPTY)
private Double zoomLongitude

在 Jackson 2.6 中,以下values 可用:

但是,如果@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;
}

【讨论】:

    【解决方案2】:

    在 POJO 上使用这个注解:

    @JsonInclude(Include.ALWAYS)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 2011-08-25
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多