Jackson 在方法中只读 属性
Jackson read-only property in method
我需要在我的 json 中公开一个 属性,它将在 getter 方法中处理。
class:
public class Configuracao{
private String departamento;
public String getDepartamento(){/**getter code**/}
public void setDepartamento(String departamento){/**setter code**/}
public String getDepartamentos(){/***Some logic code***/}
}
排在前面的json:{departamento: "Lote", departamentos: "Lotes"}
在序列化中工作正常,但是当我的前端 post 返回 json 时,jackson 抛出一个由 'departamentos' 引起的无法识别的字段异常。我怎么知道我只是想 'departamentos' 被方法值序列化而在反序列化时被忽略。我尝试了 @JsonIgnoreProperty
、@JsonGetter
和 @JsonProperty(access = JsonProperty.Access.READ_ONLY)
方法,但没有任何效果。
在Configuracao
class中定义departamentos
属性即可。
public class Configuracao{
private String departamento;
private String departamentos;
//omitted getter/setter
}
可以使用JsonIgnoreProperties
注解:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.concurrent.ThreadLocalRandom;
public class JsonPathApp {
public static void main(String[] args) throws Exception {
Configuracao c = new Configuracao();
c.setDepartamento("D1");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(c);
System.out.println(json);
System.out.println(mapper.readValue(json, Configuracao.class));
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
class Configuracao {
private String departamento;
public String getDepartamento() {
return departamento;
}
public void setDepartamento(String departamento) {
this.departamento = departamento;
}
public String getDepartamentos() {
return departamento + " " + ThreadLocalRandom.current().nextDouble();
}
@Override
public String toString() {
return "Configuracao{" +
"departamento='" + departamento + '\'' +
'}';
}
}
以上代码打印:
{"departamento":"D1","departamentos":"D1 0.8600092703789755"}
Configuracao{departamento='D1'}
JsonProperty.Access.READ_ONLY
也应该有效:
class Configuracao {
private String departamento;
public String getDepartamento() {
return departamento;
}
public void setDepartamento(String departamento) {
this.departamento = departamento;
}
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
public String getDepartamentos() {
return departamento + " " + ThreadLocalRandom.current().nextDouble();
}
@Override
public String toString() {
return "Configuracao{" +
"departamento='" + departamento + '\'' +
'}';
}
}
以上测试按预期工作。
如果您有更多 类 这样的字段和要忽略的字段,您可以禁用全局功能 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
:
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
所有内容均已使用版本 2.9.9
进行测试
我需要在我的 json 中公开一个 属性,它将在 getter 方法中处理。
class:
public class Configuracao{
private String departamento;
public String getDepartamento(){/**getter code**/}
public void setDepartamento(String departamento){/**setter code**/}
public String getDepartamentos(){/***Some logic code***/}
}
排在前面的json:{departamento: "Lote", departamentos: "Lotes"}
在序列化中工作正常,但是当我的前端 post 返回 json 时,jackson 抛出一个由 'departamentos' 引起的无法识别的字段异常。我怎么知道我只是想 'departamentos' 被方法值序列化而在反序列化时被忽略。我尝试了 @JsonIgnoreProperty
、@JsonGetter
和 @JsonProperty(access = JsonProperty.Access.READ_ONLY)
方法,但没有任何效果。
在Configuracao
class中定义departamentos
属性即可。
public class Configuracao{
private String departamento;
private String departamentos;
//omitted getter/setter
}
可以使用JsonIgnoreProperties
注解:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.concurrent.ThreadLocalRandom;
public class JsonPathApp {
public static void main(String[] args) throws Exception {
Configuracao c = new Configuracao();
c.setDepartamento("D1");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(c);
System.out.println(json);
System.out.println(mapper.readValue(json, Configuracao.class));
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
class Configuracao {
private String departamento;
public String getDepartamento() {
return departamento;
}
public void setDepartamento(String departamento) {
this.departamento = departamento;
}
public String getDepartamentos() {
return departamento + " " + ThreadLocalRandom.current().nextDouble();
}
@Override
public String toString() {
return "Configuracao{" +
"departamento='" + departamento + '\'' +
'}';
}
}
以上代码打印:
{"departamento":"D1","departamentos":"D1 0.8600092703789755"}
Configuracao{departamento='D1'}
JsonProperty.Access.READ_ONLY
也应该有效:
class Configuracao {
private String departamento;
public String getDepartamento() {
return departamento;
}
public void setDepartamento(String departamento) {
this.departamento = departamento;
}
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
public String getDepartamentos() {
return departamento + " " + ThreadLocalRandom.current().nextDouble();
}
@Override
public String toString() {
return "Configuracao{" +
"departamento='" + departamento + '\'' +
'}';
}
}
以上测试按预期工作。
如果您有更多 类 这样的字段和要忽略的字段,您可以禁用全局功能 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
:
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
所有内容均已使用版本 2.9.9
进行测试