我有这两门课:
Foo.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Foo {
private ListWrapper data;
}
ListWrapper.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ListWrapper {
@JsonValue
private List<String> value;
}
我使用以下方法来测试序列化:
public void testSerialization() throws JsonProcessingException {
Foo foo = new Foo();
foo.setData(new ListWrapper(new ArrayList<String>() {
{
add("foo");
add("bar");
}
}));
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(foo));
}
输出为{"data":["foo","bar"]}
。现在我尝试使用以下方法反序列化这个 json 字符串:
public void testDeserialization() throws IOException {
String json = "{\"data\":[\"foo\",\"bar\"]}";
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(json, Foo.class));
}
但这不起作用。我收到以下异常:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `ListWrapper` out of START_ARRAY token
at [Source: (String)"{"data":["foo","bar"]}"; line: 1, column: 9] (through reference chain: Foo["data"])
我不知道为什么会发生这种情况。谁能给我提示吗?我正在使用 Jackson 2.9.9。
最佳答案
Jackson 对象映射器抛出异常,因为它期望 data
属性为 Object
类型,但却找到了 Array
。
@JsonValue
注释用于编码。用于解码的类似注释是 @JsonCreator
。
注释您的 ListWrapper
构造函数
@JsonCreator
public ListWrapper(List<String> value) {
this.value = value;
}
关于java - Jackson - @JsonValue 注释字段无法反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57896888/