Jackson @JsonProperty() 用于注释私有字段时如何工作?

问题描述 投票:0回答:3

具体来说,我想知道在反序列化对象时,反序列化器如何设置私有字段?考虑这样的示例类:

public class MyClass {
    @JsonProperty( "My String" );
    private String myString;
}

如果使用

objectMapper.readValue(json, MyClass.class);
对其进行反序列化,如果结果对象被标记为
private
,如何设置此字段?

java json jackson deserialization
3个回答
4
投票

简短的回答是通常不能。我们使用 lombok 生成变量的 getter/setter,但您当然可以编写自己的。 Jackson 与主代码具有相同的可见性,因此如果没有一些公共 getter/setter 或像这样配置对象映射器,则无法映射私有字段...

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;
}

3
投票

在通过反射读取或写入值之前调用 Field.setAccessible(true) 可以解决此问题。

有关详细信息,请参阅相应的javadoc:https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible-boolean-

但请小心使用;-)


2
投票

相当多的框架允许通过使用

Field.setAccessible(true)
以这种方式访问私有字段。它允许应用程序忽略 Java 语言可见性规则(即私有)并通过 Reflection API
Field
类的实例读取或更改值。

在这个问题中还可以找到更多内容: Java 反射 - setAccessible(true) 的影响

© www.soinside.com 2019 - 2024. All rights reserved.