【发布时间】:2020-04-16 01:50:05
【问题描述】:
我有一个 Spring Boot 2 应用程序,其中包含私有属性和公共 getter/setter 模型。杰克逊是2.10.0 版本。
我需要一个自定义序列化器来输出 JSON 而无需扩展一些引用。根据我的阅读,如果该属性是私有的,Jackson 将无法访问它,并且会出现编译错误。除非它应该工作时有公共吸气剂。但事实并非如此。
但如果我将模型中的属性设置为公开,则不会出错。
同样,如果我在序列化器中使用 getter 而不是属性,那么一切都很好。
我看错了,序列化器真的将私有视为私有吗?
@JsonSerialize(using = ClimateSerializer.class)
public class Climate {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "climate_gen")
private long id;
private float temperature;
private float humidity;
.... getters and setters
}
序列化器
public class ClimateSerializer extends StdSerializer<Climate> {
public ClimateSerializer() {
this(null);
}
public ClimateSerializer(Class<Climate> t) {
super(t);
}
@Override
public void serialize(
final Climate value, final JsonGenerator jgen, final SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeNumberField("id", value.getId());
jgen.writeNumberField("temperature", value.getTemperature());
jgen.writeNumberField("humidity", value.getHumidity());
jgen.writeEndObject();
}
}
这会编译。
如果 write*Field 调用被替换为
jgen.writeNumberField("id", value.id);
etc
etc
然后我得到一个编译错误。无法访问私有财产。这与我所读到的背道而驰。如果有公共 getter,Jackson 可以访问私有属性。
显然直接使用 getter 是可以的。有用。但我想知道我读过的各种文档是否有误。
【问题讨论】:
-
您可以将MCVE 添加到您的问题中,以帮助您更好地理解和回答。
标签: java json spring-boot serialization jackson