簡體   English   中英

使用 Jackson 將 JSON 字符串或對象反序列化為 String 字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM