ACCEPT_EMPTY_STRING_AS_NULL_OBJECT与列表字段

时间:2018-07-23 09:26:54

标签: java json jackson

使用Jackson,我正在尝试正确地反序列化包含空字符串作为无值值的JSON。这里是一个示例:

{
  "code" : "REQ500",
  "description" : "Problem with Service",
  "params" : ""
}

还有我会得到的豆子

public final class MyError {

    @JsonProperty("code")
    private String code;

    @JsonProperty("description")
    private String description;

    @JsonProperty("params")
    private List<String> params;

    // [CUT]

    public void setParams(List<String> params) {
        this.params = params;
    }
}

使用ACCEPT_EMPTY_STRING_AS_NULL_OBJECT,我创建了一个对象映射器

public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
    .configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true)
    .registerModule(new SimpleModule().addDeserializer(LocalDate.class, new DateDeserializer()));

期望有params = null,但反序列化无效。这是我得到的错误:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot 
deserialize instance of `java.util.ArrayList` out of VALUE_STRING token
 at [Source: (String)"{
  "code" : "REQ500",
  "description" : "Problem with Service",
  "params" : ""
}"; line: 4, column: 14] (through reference chain: solutions.infinitec.fabrick.models.common.MyError["params"])

    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)

关于如何解决此问题的任何提示?我在某个地方错了吗?

预先感谢您的建议。

3 个答案:

答案 0 :(得分:1)

我使用ObjectMapper om = new ObjectMapper(); om.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); MyJson asString = om.readValue("{\n" + " \"code\" : \"REQ500\",\n" + " \"description\" : \"Problem with Service\",\n" + " \"params\" : \"\"\n" + "}", MyError.class); MyJson asArray = om.readValue("{\n" + " \"code\" : \"REQ500\",\n" + " \"description\" : \"Problem with Service\",\n" + " \"params\" : [\"\"]\n" + "}", MyError.class); 进行了尝试,并且效果正常。

MyError

您唯一需要处理的是响应,其中仅包含params中为空的单个元素。

另一种方法可能是public class MyError { @JsonProperty("code") private String code; @JsonProperty("description") private String description; private List<String> params; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public List<String> getParams() { return params; } @JsonProperty("params") private void setParams(JsonNode params) { if (params.isArray()) { this.params = new ArrayList<>(); for(JsonNode child : params) { this.params.add(child.asText()); } } } } 的定义:

IDENTITY

答案 1 :(得分:0)

只需实现一个可以接受字符串的setter方法:

public void setParams(String params) {
    this.params = null;
}

如果要接受数组:

public void setParams(String[] params) {
    this.params = Arrays.asList(params);
}

答案 2 :(得分:0)

我会尝试使用

OBJECT_MAPPER.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

"Cannot deserialize instance of java.util.ArrayList"

所示