簡體   English   中英

使用Jackson進行序列化和反序列化:如何以編程方式忽略字段?

[英]Serialization and Deserialization with Jackson: how to programmatically ignore fields?

我正在使用Jackson來序列化和反序列化對象。 問題是有時我想顯示一個字段,有時不想要。

實際上,我在使用@JsonIgnore避免在不需要屬性時打印該屬性。 當我需要時,我會通過以下方式禁用該物業

mapper.getSerializationConfig().disable(SerializationConfig.Feature.USE_ANNOTATIONS);

但這也會禁用我需要的其他注釋。

如何獲得所需的結果? 使用視圖? 有什么例子嗎?

一點點了解我想要的東西:

class User {
private String username;
@JsonIgnore    
private String password;    
    // getter setter
}


writeToDB() {
mapper.getSerializationConfig().disable(SerializationConfig.Feature.USE_ANNOTATIONS);
mapper.writeValueAsString(user);
}

並通過REST API,您可以獲得沒有密碼的用戶名(由於JsonIgnore)

最后,我以不同的方式處理了這個問題。 我當時使用的是Jersey和Guice,所以很難找出方法,但是我做到了。

基本上,我使用Jackson的MixIn批注,但是使用Jersey,我必須將ObjectMapper創建到Provider中,然后將其與Guice綁定。

這樣,當我使用REST服務時,Jersey將使用Provider中定義的ObjectMapper。 當存儲東西時,傑克遜將使用標准的ObjectMapper。

現在一些代碼。

創建PrivateUser類:

public abstract class PrivateUser {
  @JsonIgnore abstract String getPassword();
}

創建提供者:

@Provider
public class JacksonMixInProvider implements ContextResolver<ObjectMapper> {

  @Override
  public ObjectMapper getContext(Class<?> aClass) {
    final ObjectMapper mapper = new ObjectMapper();
    mapper.getSerializationConfig().addMixInAnnotations(User.class, PrivateUser.class);
    return mapper;
  }
}

並綁定它:

bind(JacksonMixInProvider.class).asEagerSingleton();

而已! :d

希望這可以幫助別人減少浪費的時間!

我認為您應該通過創建可選擇性地序列化/忽略密碼的自定義Jackson序列化程序來以不同的方式處理此問題。

這樣的注釋在運行時應該被認為是不可變的。 可能會有一些反射技巧來提取JsonIgnore並設置值,但是,如果這樣的話,這確實很JsonIgnore

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM