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

时间:2018-03-02 19:27:31

标签: java json jackson

我有一个类似于以下的Java类文件:

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

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

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

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

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文件/流映射到对象,我是否必须将此标头添加到每个类变量中? 或者我在代码中遗漏了什么?

感谢。

4 个答案:

答案 0 :(得分:3)

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

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

您有几个选项 - 您可以将其展示次数更改为public或使用@JsonProperty来帮助杰克逊识别它们,或者您可以更改ObjectMapper自动检测设置以包含{{1}字段:

  • package-protected配置:ObjectMapper
  • 班级注释:mapper.setVisibility(PropertyAccessor.FIELD, Visibility.NON_PRIVATE);

答案 1 :(得分: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 :(得分:0)

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

答案 3 :(得分: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;
    }
}