杰克逊:仅序列化标记的字段

时间:2014-03-26 17:15:02

标签: java json serialization jackson gson

我正在尝试做一些在gson中非常容易的事情。由于我切换到杰克逊作为序列化器,我无法弄清楚如何实现这个:

我想仅序列化已由Annotation标记的字段。 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
    }
 }

(语法错误可能会被忽略 - source仅用于演示)

那么杰克逊的@Exposenew GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();的杰克逊对手是什么?

4 个答案:

答案 0 :(得分:4)

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

@JsonAutoDetect(
    fieldVisibility = Visibility.NONE,
    setterVisibility = Visibility.NONE,
    getterVisibility = Visibility.NONE,
    isGetterVisibility = Visibility.NONE,
    creatorVisibility = 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;
}

答案 1 :(得分:2)

在杰克逊,你做反过来。使用@JsonIgnore注释您不想要的字段。

  

标记注释,指示带注释的方法或字段   被基于内省的序列化和反序列化忽略   功能。也就是说,不应该考虑" getter"," setter"   或"创作者"。

答案 2 :(得分:2)

似乎有一种方法可以配置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));

Source

答案 3 :(得分:2)

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;
    ...
 }

请参阅this answer一个非常相似的问题。