作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我尝试将以下 json 反序列化为 java pojo。
[{
"image" : {
"url" : "http://foo.bar"
}
}, {
"image" : "" <-- This is some funky null replacement
}, {
"image" : null <-- This is the expected null value (Never happens in that API for images though)
}]
我的 Java 类如下所示:
public class Server {
public Image image;
// lots of other attributes
}
和
public class Image {
public String url;
// few other attributes
}
我用的是jackson 2.8.6
ObjectMapper.read(json, LIST_OF_SERVER_TYPE_REFERENCE);
但我不断收到以下异常:
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of Image: no String-argument constructor/factory method to deserialize from String value ('')
如果我为它添加一个 String setter
public void setImage(Image image) {
this.image = image;
}
public void setImage(String value) {
// Ignore
}
我得到以下异常
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
无论我是否(也)添加图像 setter ,异常都不会改变。
我也试过 @JsonInclude(NOT_EMPTY)
但这似乎只影响序列化。
总结:某些(设计糟糕的)API 向我发送了一个空字符串 (""
) 而不是 null
,我必须告诉 Jackson只是忽略那个不好的值(value)。我该怎么做?
最佳答案
似乎没有开箱即用的解决方案,所以我选择了自定义反序列化器:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
public class ImageDeserializer extends JsonDeserializer<Image> {
@Override
public Image deserialize(final JsonParser parser, final DeserializationContext context)
throws IOException, JsonProcessingException {
final JsonToken type = parser.currentToken();
switch (type) {
case VALUE_NULL:
return null;
case VALUE_STRING:
return null; // TODO: Should check whether it is empty
case START_OBJECT:
return context.readValue(parser, Image.class);
default:
throw new IllegalArgumentException("Unsupported JsonToken type: " + type);
}
}
}
并使用下面的代码使用它
@JsonDeserialize(using = ImageDeserializer.class)
@JsonProperty("image")
public Image image;
关于java - 在反序列化过程中将空字符串忽略为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43350038/
我是一名优秀的程序员,十分优秀!