Java 如何指定jackson仅使用字段-最好是全局使用

Java 如何指定jackson仅使用字段-最好是全局使用,java,json,jackson,Java,Json,Jackson,默认的jackon行为似乎同时使用属性(getter和setter)和字段来序列化和反序列化为json 我想使用字段作为序列化配置的规范源,因此根本不希望jackson查看属性 我可以使用注释在单个类的基础上执行此操作: @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) @Target({Elemen

默认的jackon行为似乎同时使用属性(getter和setter)和字段来序列化和反序列化为json

我想使用字段作为序列化配置的规范源,因此根本不希望jackson查看属性

我可以使用注释在单个类的基础上执行此操作:

 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonAutoDetect(
        getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE,
        setterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE,
        creatorVisibility = JsonAutoDetect.Visibility.NONE
)
public @interface JsonExplicit {
}
但我不想把这个放在每一节课上


是否可以对其进行全局配置?是否向对象映射器添加一些?

您可以如下配置各个对象映射器:

ObjectMapper mapper  = new ObjectMapper();
mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker()
                .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

如果希望全局设置,我通常通过包装类访问已配置的映射器。

在Jackson 2.0及更高版本中,您只需使用:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;   

...

ObjectMapper mapper = new ObjectMapper();    
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

关闭自动检测。

对于jackson 1.9.10,我使用

ObjectMapper mapper = new ObjectMapper();

mapper.setVisibility(JsonMethod.ALL, Visibility.NONE);
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

打开自动删除。

专门用于
布尔值是*()
获取者:

我花了很多时间来解释为什么两者都不在下面

  @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
也不是这个

  setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
  setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
  setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
为我的布尔Getter/Setter工作

解决方案很简单:

  @JsonAutoDetect(isGetterVisibility = Visibility.NONE, ...          
  setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
更新:允许spring启动配置它:

jackson:
  visibility.field: any
  visibility.getter: none
  visibility.setter: none
  visibility.is-getter: none

请看

这个怎么样:我将它与mixin一起使用

不兼容对象

@Entity
@Getter
@NoArgsConstructor
public class Telemetry {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long pk;
    private String id;
    private String organizationId;
    private String baseType;
    private String name;
    private Double lat;
    private Double lon;
    private Instant updateTimestamp;
}
混合:

@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE)
public static class TelemetryMixin {}
用法:

    ObjectMapper om = objectMapper.addMixIn(Telemetry.class, TelemetryMixin.class);
    Telemetry[] telemetries = om.readValue(someJson, Telemetry[].class);
没有任何东西说你不能foreach任何数量的类并应用相同的mixin


如果您不熟悉mixin,那么它们在概念上很简单:mixin的结构是超级强加在目标类上的(根据jackson的说法,与JVM无关)

如果您想要一种全局执行此操作的方法,而不必担心
对象映射器的配置,您可以创建自己的注释:

 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonAutoDetect(
        getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE,
        setterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE,
        creatorVisibility = JsonAutoDetect.Visibility.NONE
)
public @interface JsonExplicit {
}
现在你只需要用
@JsonExplicit
注释你的类就可以了

还要确保编辑上面对
@jsonautodect
的调用,以确保将值设置为与程序一起工作的值


感谢您帮助我了解有关JacksonAnnotationsInside

的信息。如果您使用Spring Boot,您可以按如下方式全局配置Jackson

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@Configuration
public class JacksonObjectMapperConfiguration implements Jackson2ObjectMapperBuilderCustomizer {

    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder.visibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
        jacksonObjectMapperBuilder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
        jacksonObjectMapperBuilder.visibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.ANY);
    }

}


@自2.10版以来,我们可以使用和接受的答案如下所示:

JsonMapper mapper = JsonMapper.builder()
    .visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
    .visibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
    .visibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE)
    .visibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE)
    .build();


很好,不过我认为您可能还需要设置checker(withXxx()方法通常会创建一个新对象)。所以类似于“mapper.setVisibilityChecker(mapper.getVisibilityChecker().with…”之类的东西@StaxMan对setVisibilityChecker进行了很好的调用,我编辑了答案以反映。
WithGettServiceability
不包括
is*
方法,但有
WithIsGettServiceability
方法适用于它们。
setVisibilityChecker
不推荐使用。改用
setVisibility
。这正是我需要的!这种配置允许我使用Mixin轻松地将Hibernate实体转换为dto。默认情况下,ObjectMapper序列化所有内容,并且Mixin必须指定要忽略的属性(即减法而不是交集)。另一种可能性是,如果您有一个公共基类,您可以将类注释放在该基类上;注释是由Jackson继承的。我想我试过了,但似乎你必须告诉子类使用基本用例定义的内容……不,除非子类重写类注释,否则父类的注释是可见的,就像它们是子类定义的一部分一样(如果不是,这将是一个bug)。这不一定是JDK处理注释的方式,但Jackson实现了注释的完全继承(即使是方法注释也是如此)。如果有一个可见的getter或field,它将强制setter的可见性。大家好,我使用的是Jackson 1.9.0 jar。在将对象序列化为json字符串时,我获得了额外的json属性。我需要获取json字符串,它只包含提到的带有@JsonProperty的变量。你能在这方面帮助我吗?你可以从OP问题中提到的类注释开始:
@jsonautodect(fieldVisibility=Visibility.NONE,getterVisibility=Visibility.NONE,setterVisibility=Visibility.NONE)
接下来,你必须注释你想要包含在
@JsonProperty
中的每个属性,谢谢!以前,我发现了许多引用JsonMethod而不是PropertyAccessor的代码示例。如果您搜索JsonMethod,您很少会获得指向PropertyAccessor的链接,然后。。。在后续工件中查找替换类名的最佳方法是什么?可能很难对付,不是吗?就是这样。谢谢。不知道这样做和禁用“自动检测”之间有什么区别。你能详细说明一下如何将简单的解决方案应用到bean类吗?谢谢。这不是对这个问题的回答,而是误导。