![](/img/trans.png)
[英]How to ignore certain fields for deserialization without jackson annotations?
[英]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.