使用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)
关于如何解决此问题的任何提示?我在某个地方错了吗?
预先感谢您的建议。
答案 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);
所示