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)
如果你想全局设置,我通常通过包装类访问配置的映射器.
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)
关闭自动检测.
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)
转向自动解除.
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).
如果您使用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)
如果您想要一种全局执行此操作而不用担心 的配置的方法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
归档时间: |
|
查看次数: |
121273 次 |
最近记录: |