使用Jackson将Json文件映射到POJO所需的@JsonProperty

问题描述 投票:1回答:4

我有一个Java类文件,如下所示:

public class ToBeMapped {
     String value1;
     int value 2;
}

然后我有一个名为“test.json”的JSON文件,如下所示:

{
    "value1": "hellow world",
    "value2": 12345
}

然后我尝试将JSON文件映射到另一个Java文件中的“TobeMapped”对象:

public class Testing {
    public void justTesting() throws IOException {
        ToBeMapped temp = new ObjectMapper().readValue(new File("path/to/test.json"), ToBeMapped.class);
    }
}

这会给我以下错误:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "value1" ...

如果我在每个类变量之前添加@JsonProperty,如下所示,我可以将JSON文件映射到POJO而没有任何错误。

public class ToBeMapped {

     @JsonProperty
     String value1;

     @JsonProperty
     int value 2;
}

为了让Jackson的映射器将JSON文件/流映射到对象,我是否必须将此标头添加到每个类变量中?或者我在代码中遗漏了一些东西?

谢谢。

java json jackson
4个回答
2
投票

默认情况下,Jackson只会使用getter,setter和public字段将Java对象映射到JSON,反之亦然。您可以将@JsonProperty注释添加到要映射的每个字段,也可以提供公共getter和setter,或者您可以使用@JsonAutoDetect注释告诉Jackson使用您的类的字段:

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)

但是,提供公共getter和setter并使您的类成为适当的Java-bean应该是首选的解决方案。


2
投票

默认情况下,Jackson的自动检测绑定public字段和public setter以进行反序列化(将JSON表示转换为Java对象)。

在你的情况下,value1value2能见度是package-protected,因此杰克逊不会自动检测。

您有几个选项 - 您可以将其可见性更改为public或使用@JsonProperty来帮助Jackson识别它们,或者您可以更改ObjectMapper设置以进行自动检测以包含package-protected字段:

  • ObjectMapper配置:mapper.setVisibility(PropertyAccessor.FIELD, Visibility.NON_PRIVATE);
  • 类注释:@JsonAutoDetect(fieldVisibility = Visibility.NON_PRIVATE)

0
投票

我认为他们应该公开或有固定人员。你有2号错字(不能使用空间)


0
投票

不,你不需要@JsonProperty,只需添加setter。

public class ToBeMapped {

    private String value1;
    private int value;

    public String getValue1() {
        return value1;
    }
    public void setValue1(String value1) {
        this.value1 = value1;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.