使用Jackson将Json文件映射到POJO所需的@JsonProperty
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Jackson将Json文件映射到POJO所需的@JsonProperty相关的知识,希望对你有一定的参考价值。
我有一个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文件/流映射到对象,我是否必须将此标头添加到每个类变量中?或者我在代码中遗漏了一些东西?
谢谢。
默认情况下,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应该是首选的解决方案。
默认情况下,Jackson的自动检测绑定public
字段和public
setter以进行反序列化(将JSON表示转换为Java对象)。
在你的情况下,value1
和value2
能见度是package-protected
,因此杰克逊不会自动检测。
您有几个选项 - 您可以将其可见性更改为public
或使用@JsonProperty
来帮助Jackson识别它们,或者您可以更改ObjectMapper
设置以进行自动检测以包含package-protected
字段:
ObjectMapper
配置:mapper.setVisibility(PropertyAccessor.FIELD, Visibility.NON_PRIVATE);
- 类注释:
@JsonAutoDetect(fieldVisibility = Visibility.NON_PRIVATE)
我认为他们应该公开或有固定人员。你有2号错字(不能使用空间)
不,你不需要@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;
}
}
以上是关于使用Jackson将Json文件映射到POJO所需的@JsonProperty的主要内容,如果未能解决你的问题,请参考以下文章
不改变 POJO 的不区分大小写的 JSON 到 POJO 的映射
使用jackson将pojo(对象列表)转换为java中的json