如何解决用于注释私有字段的Jackson @JsonProperty如何工作?
具体来说,我想知道反序列化对象时反序列化器如何设置私有字段?考虑这样的示例类:
public class MyClass {
@JsonProperty( "My String" );
private String myString;
}
如果使用objectMapper.readValue(json,MyClass.class);
将其反序列化,如果将生成的对象标记为private
,如何设置该字段?
解决方法
在通过反射读取或写入值之前调用Field.setAccessible(true)可以解决问题。
有关详细信息,请参见相应的javadoc:https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible-boolean-
但是要小心使用;-)
,相当多的框架允许使用Field.setAccessible(true)
以这种方式访问私有字段。它允许应用程序忽略Java语言可见性规则(即私有),并通过反射API Field
类的实例读取或更改值。
在此问题中可以找到更多信息: Java reflection - impact of setAccessible(true)
,简短的回答是它通常无法正常运行。我们使用lombok生成变量的getter / setter,但是您当然可以编写自己的变量。 Jackson具有与您的主代码相同的可见性,因此,如果没有一些公共获取器/设置器或像这样配置对象映射器,就无法映射私有字段... objectMapper.setVisibility(PropertyAccessor.FIELD,Visibility.ANY);
。
这两个都无法正常序列化。您可以在课程级别使用Lombok @Getter
和@Setter
,以便Jackson可以与myString
一起使用,或者将@JsonAutoDetect(fieldVisibility = Visibility.ANY)
放在下面的课程级别。
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class MyClass {
@JsonProperty( "My String" );
private String myString;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。