我正在使用Jackson 2库,我正在尝试读取JSON响应,如下所示:
{ "value":"Hello" }
Run Code Online (Sandbox Code Playgroud)
当值为空时,JSON响应如下所示:
{ "value":{} }
Run Code Online (Sandbox Code Playgroud)
我的模型POJO类看起来像这样
public class Hello {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当响应看起来像{value:{}}时,Jackson正在尝试读取一个Object,但我的模型类字段是一个字符串,所以它抛出一个Exception:
JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token.
Run Code Online (Sandbox Code Playgroud)
我的问题是杰克逊如何成功阅读看起来像这样的JSON:
{"value":"something"}
Run Code Online (Sandbox Code Playgroud)
同时如果响应看起来像这个{"value":{}}(我的空响应),则将null传递给我的Hello模型类的value字段.
我正在使用下面的代码来读取JSON字符串:
String myJsonAsString = "{...}";
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(myJsonAsString , Hello.class);
Run Code Online (Sandbox Code Playgroud)
您可以为此feld使用自定义反序列化程序.这是一个返回字符串,如果它在那里,或在任何其他情况下为null:
public class Hello {
@JsonDeserialize(using = StupidValueDeserializer.class)
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
public class StupidValueDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonToken jsonToken = p.getCurrentToken();
if (jsonToken == JsonToken.VALUE_STRING) {
return p.getValueAsString();
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)