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?
'JsonSerializer' üzerinde bu imzayla hiçbir yöntem yoktur. Ayrıca, 'NON_EMPTY' değil' NON_DEFAULT'ı soruyorum. – QuantumMechanic
NON_EMPTY ile NON_DEFAULT arasındaki not için teşekkürler. Sorudaki hatayı düzeltmek için soruyu düzenledim. – QuantumMechanic
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