2014-03-26 25 views
4

我想要做一些在gson中很容易的事情。由于我切换到杰克逊作为序列化程序,我无法弄清楚如何实现这一点:杰克逊:序列化仅标记字段

我想序列化只有由标注标记的字段。 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的@Exposenew GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

回答

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

2

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

标记注释,指示注解的方法或字段是 通过基于内省序列化和反序列化 功能被忽略。也就是说,它不应该被认为是“吸气剂”,“制造者”或“创造者”。

+0

我知道,问题是,我的课有更多的领域被忽略,而不是被序列化。例如50个字段中只有一个应该被序列化。所以相反的方法是选择的方法。 – gorootde

+0

@k_wave据我所知,没有这种功能。 –

+0

@k_wave如果您愿意更改您的字段/获取者/设置者的访问修饰符,您可以使用可见性进行游戏。 –

1

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到一个非常类似的问题。

2

如果你想它只是针对特定类型的你也可以只使用注释:

@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; 
} 
+0

您还必须添加对JsonProperty注释的只读访问:'@JsonProperty(access = READ_ONLY)',否则序列化程序将显示为空。请看这里:https://github.com/daggerok/spring-5-examples/blob/master/github-api-v3-gateway/webflux-gateway/src/main/java/daggerok/github/GithubProperties.java –

+0

Exactly我需要什么,谢谢 – YingYang