对我有用的解决方案是创建一个自定义JSON反序列化器,将null转换为Double.NaN.调整我写的内容以匹配上面的示例代码,它看起来像这样.
public class ThingDeserializer extends JsonDeserializer {
@Override
public Thing deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
JsonProcessingException {
Thing thingy = new Thing();
JsonNode node = jp.getCodec().readTree(jp);
if (node.get("latitude").isNull()) {
thingy.setLatitude(Double.NaN);
} else {
thingy.setLatitude(node.get("latitude").asDouble());
}
if (node.get("longitude").isNull()) {
thingy.setLongitude(Double.NaN);
} else {
thingy.setLongitude(node.get("longitude").asDouble());
}
if (node.get("altitude").isNull()) {
thingy.setAltitude(Double.NaN);
} else {
thingy.setLatitude(node.get("altitude").asDouble());
}
return thingy;
}
然后我通过在类声明上面添加注释在类Thing中注册反序列化器.
@JsonDeserialize(using = ThingDeserializer.class)
public class Thing implements Serializable {
... class code here ...
}
注意我认为更好的答案是反序列化Double类而不是Thing类.通过反序列化Double,您可以概括从null到NaN的转换.这也将取消从字段名称中拉出节点中的特定字段.我无法弄清楚如何在有限的时间内完成这项工作,所以这对我有用.此外,反序列化实际上是由Jackson通过REST api隐式调用的,所以我不确定如何改变这些事情.我很乐意看到一个可以实现这一目标的解决方案.