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

Java Jackson@JsonProperty()在用于注释私有字段时是如何工作的?,java,json,jackson,deserialization,Java,Json,Jackson,Deserialization,具体地说,我想知道当反序列化对象时,反序列化程序如何设置私有字段?考虑这样一个示例类: public class MyClass { @JsonProperty( "My String" ); private String myString; } 如果这是使用objectMapper.readValuejson、MyClass.class反序列化的;如果结果对象被标记为private,那么该字段是如何设置的?简单的回答是,它不能正常设置。我们使用lombok

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

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

如果这是使用objectMapper.readValuejson、MyClass.class反序列化的;如果结果对象被标记为private,那么该字段是如何设置的?

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

它也无法正常序列化。您可以在类级别上使用Lombok@Getter和@Setter,以便Jackson可以使用myString,或者在类级别上放置@JsonAutoDetectfieldVisibility=Visibility.ANY,如下所示

@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class MyClass {
    @JsonProperty( "My String" );
    private String myString;
}

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

它也无法正常序列化。您可以在类级别上使用Lombok@Getter和@Setter,以便Jackson可以使用myString,或者在类级别上放置@JsonAutoDetectfieldVisibility=Visibility.ANY,如下所示

@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class MyClass {
    @JsonProperty( "My String" );
    private String myString;
}

在通过反射读取或写入值之前调用Field.setAccessibletrue可以实现这一点

有关详细信息,请参阅相应的javadoc:


但要小心使用-

在通过反射读取或写入值之前调用Field.setAccessibletrue可以实现这一点

有关详细信息,请参阅相应的javadoc:


但要小心使用-

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

在这个问题中可以找到更多:

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

在这个问题中可以找到更多:

相关:。相关:。