Jackson:仅序列化标记的字段

问题描述 投票:0回答:4

我正在尝试做一些在 gson 中非常简单的事情。自从我改用 Jackson 作为序列化器后,我不知道如何实现这个:

我只想序列化已用注释标记的字段。 GSON 代码为:

class Foo {
    @Expose
    public String sometext="Hello World";
    @Expose
    public int somenumber=30;
    public float noop=1.0;
    ...
 }

这应该会产生(JSON)

 {
    Foo: {
        sometext:'Hello World',
        somenumber: 30
    }
 }

(语法错误可以忽略 - 源代码仅供演示)

那么 gson 的

@Expose
new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
的 Jackson 对应项是什么?

java json serialization jackson gson
4个回答
11
投票

如果您只想将其用于特定类型,您也可以只使用注释:

import com.fasterxml.jackson.annotation.JsonAutoDetect;


@JsonAutoDetect(
    fieldVisibility = JsonAutoDetect.Visibility.NONE,
    setterVisibility = JsonAutoDetect.Visibility.NONE,
    getterVisibility = JsonAutoDetect.Visibility.NONE,
    isGetterVisibility = JsonAutoDetect.Visibility.NONE,
    creatorVisibility = JsonAutoDetect.Visibility.NONE
)
public class Foo  {
    @JsonProperty
    public String sometext="Hello World";
    @JsonProperty
    public int somenumber=30;
    // noop won't get serialized
    public float noop= 1.0f;
}

4
投票

new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
对应的是初始化一个ObjectMapper,如下所示:

...
ObjectMapper objectMapper = new ObjectMapper();        
objectMapper.disable(MapperFeature.AUTO_DETECT_CREATORS,
            MapperFeature.AUTO_DETECT_FIELDS,
            MapperFeature.AUTO_DETECT_GETTERS,
            MapperFeature.AUTO_DETECT_IS_GETTERS);
...

@Expose
的对应项是
@JsonProperty
。使用上面的示例 bean:

class Foo {
    @JsonProperty
    public String sometext="Hello World";
    @JsonProperty
    public int somenumber=30;
    public float noop=1.0;
    ...
 }

请参阅这个答案,这是一个非常相似的问题。


3
投票

似乎有一种方法可以配置

ObjectMapper
来忽略所有未注释的字段。

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

来源


2
投票

在杰克逊,你的做法正好相反。使用

@JsonIgnore
注释您不需要的字段。

标记注释,指示被注释的方法或字段是 被基于内省的序列化和反序列化忽略 功能。也就是说,它不应该被视为“getter”、“setter” 或“创造者”。

© www.soinside.com 2019 - 2024. All rights reserved.