2011-08-18 14 views
136

Varsayılan jackon davranışı, hem özellikleri (alıcılar ve ayarlayıcılar) hem de serileştirilecek ve seri hale getirilecek alanları json olarak kullanır.jackson'u yalnızca alanları kullanmak için belirtme - tercihen global olarak

Ben jackson hiç özelliklerine bakmak istemiyorum böylece seri hale config kanonik kaynağı olarak alan kullanmak ve istiyoruz. Ben açıklama ile bireysel sınıf bazında yapabilirsiniz

:

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) 

Ama her sınıfa bu koymak zorunda kalmak istemiyoruz ...

o mümkün mü bunu global olarak yapılandırır mısınız? Nesne Eşleştiricisi'ne biraz eklemek gibi?

+1

Tim iyi bir cevap verdi. Diğer bir olasılık ise, ortak bir temel sınıfınız varsa, bu konuya sınıf ek açıklamaları koyabilirsiniz; ek açıklamaları Jackson tarafından devralınır. – StaxMan

+1

Sanırım bunu denedim, ancak alt sınıfların temel durumun ne olduğunu tanımlaması gerektiğini söylemeniz gerekiyor ... –

+2

Hayır, alt sınıfın sınıf notlarını geçersiz kılmadığı sürece, ebeveynin ek açıklamaları alt bölümlerin parçasıymış gibi görünür. sınıf tanımı (değilse, bu bir hata olacaktır). Bu, JDK'nın ek açıklamalarla nasıl ilgileneceği değildir, ancak Jackson ek açıklamalarda (yöntem açıklamaları için bile) tam miras uygular. – StaxMan

cevap

117

Böyle bireysel ObjectMappers yapılandırabilirsiniz:

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

bunu genel olarak belirlenmedi istiyorsanız, ben genellikle sarmalayıcı sınıf üzerinden yapılandırılmış bir mapper erişin.

Jackson 2.0'da
+3

İyi, her ne kadar ben de denetleyiciyi ayarlamanız gerekebileceğini düşünüyorum (withXxx() yöntemleri genellikle yeni bir nesne yaratır). Yani 'mapper.setVisibilityChecker (mapper.getVisibilityChecker(). ... ile bir şey);' – StaxMan

+0

@StaxMan setVisibilityChecker iyi çağrı, yansıtacak yanıtı düzenledim. –

+32

'GetterVisibility' ile 'is *' yöntemleri yoktur, ancak onlar için 'withIsGetterVisibility' vardır. – qerub

103

ve daha sonra basitçe kullanabilirsiniz:

import com.fasterxml.jackson.annotation.JsonAutoDetect; 
import com.fasterxml.jackson.annotation.PropertyAccessor; 
import com.fasterxml.jackson.databind.ObjectMapper; 

... 

ObjectMapper mapper = new ObjectMapper();  
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE); 
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); 

autodetection kapatmak için.

+1

Merhaba millet, Ben Jackson 1.9.0 jar kullanıyorum. Nesneyi json dizesine serileştirirken ek json özelliği alıyorum. Sadece @JsonProperty ile belirtilen değişkenleri içeren json dizesini almam gerekiyor. Bu konuda bana yardımcı olabilir misiniz? – jrhamza

+6

OP soruda belirtilen sınıf notu ile başlayabilirsiniz: '@JsonAutoDetect (alanVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)' Ardından, eklemek istediğiniz her özelliğe açıklama eklemeniz gerekir. @ @ JsonProperty' – lukk

10

jackson 1.9.10 için ben oto dedection ait açmak için

ObjectMapper mapper = new ObjectMapper(); 

mapper.setVisibility(JsonMethod.ALL, Visibility.NONE); 
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY); 

kullanın. ne

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) 

hiçbir

setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE); 
    setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); 
    setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

benim boolean alıcı/setter için çalışmıyor neden:

+1

Bu yoldur. Teşekkürler. – cuneytykaya

+0

, bunu yapmak ve "otomatik algılar" özelliğini devre dışı bırakmak arasında bir fark olup olmadığını merak ediyor. – xenoterracide

22

Ben çok fazla zaman harcamak ettik. Çözüm simpe geçerli:

@JsonAutoDetect(isGetterVisibility = Visibility.NONE, ...   
    setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE); 
+0

Fasulye sınıfına çözümün ne kadar basit uygulanacağını açıklar mısınız? –

+1

Teşekkür ederiz. Bu benim için GetGetter günü kurtardı. – grinch

7

bu konuda nasıl

@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE) 
public static class TelemetryMixin {} 

Kullanımı:

Bir mixin

uyumlu olmayan nesne

@Entity 
@Getter 
@NoArgsConstructor 
public class Telemetry { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long pk; 
    private String id; 
    private String organizationId; 
    private String baseType; 
    private String name; 
    private Double lat; 
    private Double lon; 
    private Instant updateTimestamp; 
} 

Mixin ile kullandı

ObjectMapper om = objectMapper.addMixIn(Telemetry.class, TelemetryMixin.class); 
    Telemetry[] telemetries = om.readValue(someJson, Telemetry[].class); 

Herhangi bir sınıftan ayrılmayıp aynı karışıma uygulayamayacağınızı söyleyen bir şey yok.

Eğer Mixins aşina değiliz, onlar kavramsal basitçe şunlardır: mixin yapısı süper hedef sınıfına dayatılan olduğunu (jackson göre değil kadarıyla JVM söz konusu olduğunda).

İlgili konular