java - Jackson - @JsonValue 注释字段无法反序列化

标签 java json jackson

我有这两门课:

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/

相关文章:

java - Spark和Java基于两种条件过滤列

java - HttpURLConnection POST 请求抛出 IOException

json - Play Framework : Request_denied when getting json from googlemap url

php - 通过 POST 将 JSON 编码的变量从 PHP 传递到 Javascript

java - 如何使用 xmlhttprequest 从 javascript 将字符串发送到 servlet

Java - jackson 到一个文件

java - 使用 Jackson 从 URL 解析 JSON 数据时返回空值

java - 为什么我需要为 EditText.getText() 创建一个对象?

java.net.ConnectException : Connection refused with Google Maps

java - 我可以忽略一个带有 Jackson 和 Spring 的 setter 吗?