2016-03-29 17 views
2

Her ikisi de özel bir seri hale getirici kullanmak ve JsonInclude.Include.NON_DEFAULT belirtme onuruna sahip olmak istiyorum. Özel bir seri hale getirici kullanmadığım zaman onurlandırılır, ancak özel bir seri hale getirici kullandığımda bu değildir.JsonInclude.Include.NON_DEFAULT özel seri hale getirici ile çalışmaz

Bu, Jackson 2.2.2'dir. Şu anda Jackson'ın daha yeni bir versiyonuna geçme seçeneğim yok.

Burada sorunu gösteren basit bir örnek:

import com.fasterxml.jackson.annotation.JsonGetter; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializerProvider; 
import com.fasterxml.jackson.databind.annotation.JsonSerialize; 

import java.io.IOException; 
import java.util.EnumSet; 
import java.util.Set; 
import java.util.stream.Collectors;  

public class JacksonSerialization 
{ 
    public static void main(String[] args) throws Exception { 
     ObjectMapper serializer = new ObjectMapper(); 

     Foo foo = new Foo(); 
     foo.setFlags(EnumSet.of(Flag.CC, Flag.BB)); 
     System.out.println(serializer.writeValueAsString(foo)); 

     foo = new Foo(); 
     System.out.println(serializer.writeValueAsString(foo)); 
    } 

    public static enum Flag 
    { 
     AA, 
     BB, 
     CC 
    } 

    @JsonInclude(JsonInclude.Include.NON_DEFAULT) 
    public static class Foo 
    { 
     private Set<Flag> flags; 

     public Foo() { 
      flags = EnumSet.of(Flag.AA); 
     } 

     @JsonGetter("f") 
     @JsonSerialize(using = FlagSetSerializer.class) 
     public Set<Flag> getFlags() { 
      return flags; 
     } 

     public void setFlags(Set<Flag> theFlags) { 
      flags = theFlags; 
     } 
    } 

    public static class FlagSetSerializer extends JsonSerializer<Set<Flag>> 
    { 
     @Override 
     public void serialize(Set<Flag> value, 
           JsonGenerator jsonGenerator, 
           SerializerProvider serializerProvider) throws IOException { 
      String csv = value.stream() 
        .map(Flag::toString) 
        .collect(Collectors.joining(",")); 
      jsonGenerator.writeString(csv); 
     } 
    } 
} 

Ve burada çıkış: bu varsayılan değeri vardır bile f tefrika edildiğini

{"f":"BB,CC"} 
{"f":"AA"} 

Not. Sonra @JsonSerialize ek açıklama dışarı yorum yaparsanız ben şu çıktıyı almak:

{"f":["BB","CC"]} 
{} 

Sonra f düzgün değil tefrika olsun. Ama elbette, istediğim formatta işler serileştirilmiyor.

Sınıfın @JsonInclude ek açıklamasını onurlandırmak için özel seri hale getiriciyi nasıl alabilirim?

cevap

2

Muhtemelen diyor documentation, başına public boolean isEmpty(SerializerProvider provider, T value) uygulamak istiyorum:

kamu boolean isEmpty (SerializerProvider sağlayıcı T değeri) verilen seri hale getirilebilir değer kabul edilir olmadığını kontrol etmek denir

Yöntemi " boş "değer (boş değerlerinin serileştirilmesini önlemek amacıyla).

Varsayılan uygulama, boş değerlerin yalnızca boş olarak değerlendirilmesini dikkate alacaktır. https://github.com/FasterXML/jackson-databind/issues/730

bela bir diğer olası kaynak gereğince

hakkında NON_EMPTY konuşmak ama kod NON_DEFAULT kullanır.


Ve doğrusu çok fazla hata ayıklayıcıda kazma senin testleri geçmek görünüyor

@JsonSerialize(using = FlagSetSerializer.class, include = JsonSerialize.Inclusion.NON_DEFAULT)

önermek götürüyor.

sorun ilk özellikte bir @JsonInclude özniteliği arar hangi JacksonAnnotationInspector#findSerializationInclusion gibi görünüyor ve bu bulmak için başarısız olduğunda, bir @JsonSerialize ek açıklama arar. @JsonSerialize, varsayılan değeri ALWAYS olan, kullanımdan kaldırılmış bir include özelliği içerir.

Çok derinden bakmadım, ancak bazı işlevselliği kesmeyi başarmış bir kullanımdan kaldırılma/yeniden işlenenden şüpheleniyorum. C'est la vie.

+0

'JsonSerializer' üzerinde bu imzayla hiçbir yöntem yoktur. Ayrıca, 'NON_EMPTY' değil' NON_DEFAULT'ı soruyorum. – QuantumMechanic

+0

NON_EMPTY ile NON_DEFAULT arasındaki not için teşekkürler. Sorudaki hatayı düzeltmek için soruyu düzenledim. – QuantumMechanic

+0

Hangi sürümü kullanıyorsunuz Jackson? Public boolean isEmpty (T değeri) 'ne bakmak isteyebilirsiniz. Ancak, NON_DEFAULT'ın işlenmesini arıyorsanız, bunların hepsi önemli olmayabilir. – ptomli