使用Jackson将JSON字符串或对象反序列化为String字段

Kos*_*tis 4 java json jackson

我正在使用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)

JB *_*zet 7

您可以为此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)