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

Mic*_*les 177 java json jackson

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

我想使用这些字段作为序列化配置的规范来源,因此不希望jackson完全查看属性.

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

 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
Run Code Online (Sandbox Code Playgroud)

但我不想把它放在每一堂课......

是否可以在全球范围内进行配置?喜欢在Object Mapper中加一些?

小智 147

您可以像这样配置各个ObjectMappers:

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));
Run Code Online (Sandbox Code Playgroud)

如果你想全局设置,我通常通过包装类访问配置的映射器.

  • `withGetterVisibility`不包括`is*`方法,但它们有`withIsGetterVisibility`. (39认同)
  • ```setVisibilityChecker```已被弃用.请改用```setVisibility```. (12认同)
  • 好,虽然我认为你可能还需要设置检查器(withXxx()方法通常会创建一个新对象).所以像'mapper.setVisibilityChecker(mapper.getVisibilityChecker().with ...);' (3认同)

luk*_*ukk 143

在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);
Run Code Online (Sandbox Code Playgroud)

关闭自动检测.

  • 您可以从OP问题中提到的类注释开始:`@JsonAutoDetect(fieldVisibility = Visibility.NONE,getterVisibility = Visibility.NONE,setterVisibility = Visibility.NONE)`接下来,您必须使用`@JsonProperty注释要包含的每个属性` (7认同)

GKi*_*lin 34

特别适用于boolean is*()吸气剂:

我花了很多时间研究为什么不在下面

  @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
Run Code Online (Sandbox Code Playgroud)

也不是这个

  setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
  setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
  setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
Run Code Online (Sandbox Code Playgroud)

为我的布尔Getter/Setter工作.

解决方案很简单:

  @JsonAutoDetect(isGetterVisibility = Visibility.NONE, ...          
  setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
Run Code Online (Sandbox Code Playgroud)


mfe*_*mfe 13

对于杰克逊1.9.10我用

ObjectMapper mapper = new ObjectMapper();

mapper.setVisibility(JsonMethod.ALL, Visibility.NONE);
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
Run Code Online (Sandbox Code Playgroud)

转向自动解除.

  • 就是这样。谢谢。 (2认同)

Chr*_*rno 10

怎么样:我用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;
}
Run Code Online (Sandbox Code Playgroud)

混入:

@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE)
public static class TelemetryMixin {}
Run Code Online (Sandbox Code Playgroud)

用法:

    ObjectMapper om = objectMapper.addMixIn(Telemetry.class, TelemetryMixin.class);
    Telemetry[] telemetries = om.readValue(someJson, Telemetry[].class);
Run Code Online (Sandbox Code Playgroud)

没有任何东西可以说你无法预测任何数量的课程并应用相同的混音.

如果你不熟悉mixins,它们在概念上就是简单的:mixin的结构超级强加在目标类上(根据jackson,而不是JVM).


Tim*_*mes 7

如果您使用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);
    }

}

Run Code Online (Sandbox Code Playgroud)


ret*_*vil 6

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

@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 {
}
Run Code Online (Sandbox Code Playgroud)

现在您只需使用注释您的课程@JsonExplicit即可开始!

还要确保编辑上面的调用,@JsonAutoDetect以确保您的值设置为适用于您的程序。

感谢/sf/answers/938616521/帮助我了解@JacksonAnnotationsInside