我有一个类似于以下的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文件/流映射到对象,我是否必须将此标头添加到每个类变量中? 或者我在代码中遗漏了什么?
感谢。
答案 0 :(得分:3)
默认情况下,Jackson的自动检测绑定public
字段和public
setter以进行反序列化(将JSON表示转换为Java对象)。
在您的情况下,value1
和value2
可见度为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;
}
}