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

时间:2020-08-14 21:25:16

标签: java json jackson deserialization

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

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

如果使用objectMapper.readValue(json, MyClass.class);将其反序列化,如果将生成的对象标记为private,如何设置该字段?

3 个答案:

答案 0 :(得分:1)

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

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

但是要小心使用;-)

答案 1 :(得分:1)

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

在此问题中可以找到更多信息: Java reflection - impact of setAccessible(true)

答案 2 :(得分:0)

简短的回答是它通常无法正常运行。我们使用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;
}