![](/img/trans.png)
[英]Jackson deserialize JSON string with empty string instead of object
[英]Use Jackson to deserialize JSON string or object into a String field
我正在使用 Jackson 2 庫,我正在嘗試讀取 JSON 響應,它看起來像:
{ "value":"Hello" }
當值為空時,JSON 響應如下所示:
{ "value":{} }
我的模型 POJO 類看起來像這樣
public class Hello {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
問題是當響應看起來像 {value:{}} 時,Jackson 試圖讀取一個對象,但我的模型類字段是一個字符串,所以它拋出一個異常:
JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token.
我的問題是 Jackson 如何成功讀取如下所示的 JSON:
{"value":"something"}
同時,如果響應看起來像這樣 {"value":{}}(對我來說是空響應),請將 null 傳遞給我的 Hello 模型類的 value 字段。
我正在使用下面的代碼來讀取 JSON 字符串:
String myJsonAsString = "{...}";
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(myJsonAsString , Hello.class);
您可以為此字段使用自定義解串器。 這是一個返回字符串(如果存在)或 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;
}
}
JB Nizet 的 Txh,但如果您獲得的類型不是 String(例如 Object),Jackson 反序列化器會嘗試反序列化內部 Object 並可能引發潛在異常。 之后,json中的其他字段在Java中填充為null。
為了避免這種情況,你會忽略孩子
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonToken jsonToken = p.currentToken();
if (jsonToken == JsonToken.VALUE_STRING) {
return p.getValueAsString();
}
p.skipChildren();
return "other_string";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.