Soru Jackson ile eşleştirirken varsayılan değerleri boş alanlara ayarlama


Bazı JSON nesnelerini Jackson ile Java nesnelerine eşlemeye çalışıyorum. JSON nesnesindeki alanların bazıları zorunludur (bunlarla işaretleyebilirim) @NotNull) ve bazıları isteğe bağlıdır.

Jackson ile eşleştirmeden sonra, JSON nesnesinde ayarlanmamış olan tüm alanların Java'da boş bir değeri olacaktır. Benzer bir açıklama var mı @NotNull Bu, Jackson'ın bir Java sınıf üyesine varsayılan bir değer koymasını söyleyebildi, boş olması durumunda?

Düzenle: Soruyu daha açık hale getirmek için bir kod örneği var.

Java nesnesi:

class JavaObject {
    @NotNull
    public String notNullMember;

    @DefaultValue("Value")
    public String optionalMember;
}

JSON nesnesi aşağıdakilerden biri olabilir:

{
    "notNullMember" : "notNull"
}

veya:

{
    "notNullMember" : "notNull",
    "optionalMember" : "optional"
}

@DefaultValue ek açıklamalar sadece ne sorduğumu göstermektir. Bu gerçek bir açıklama değil. JSON nesnesi ilk örnekte olduğu gibi ise, optionalMember olmak "Value" ve yok null. Böyle bir şeyi yapan bir ek açıklama var mı?


32
2017-09-14 19:15


Menşei




Cevaplar:


Varsayılan değeri ayarlamak için bir ek açıklama yoktur.
Varsayılan değeri sadece java sınıf seviyesinde ayarlayabilirsiniz:

public class JavaObject 
{
    public String notNullMember;

    public String optionalMember = "Value";
}

43
2017-09-14 21:54



Bu, optionalMember için json yoksa varsayılan bir değer verir. "Null" olarak ayarlanan json varsa, "Value" değil, null olacaktır - Lee Meador
Nasıl kaydedileceğini gösteren bir cevap eklendi Value durumunda null - Sergey Voitovich


Tek bir çözüm önerisi default-value ne zaman some-value:null açıkça belirlendi (POJO okunabilirliği orada kayboldu ve beceriksiz)

Birisi nasıl tutabilir default-value ve asla null

@JsonProperty("some-value")
public String someValue = "default-value";

@JsonSetter("some-value")
public void setSomeValue(String s) {
    if (s != null) { 
        someValue = s; 
    }
}

6
2018-01-31 18:43





Çözüm, varsayılan yapıcı içindeki özelliklerin değerini belirlemektir. Yani bu durumda java sınıfı:

class JavaObject {

    public JavaObject() {

        optionalMember = "Value";
    }

    @NotNull
    public String notNullMember;

    public String optionalMember;
}

Jackson ile eşleştirmeden sonra optionalMember JSON'da eksik olan Java sınıfındaki değeri "Value".

Ancak, ek açıklamalarla ve varsayılan kurucu olmadan bir çözüm olup olmadığını bilmek istiyorum.


5
2017-09-14 21:15



Ancak JSON değeri null olursa, optionalMember boş olarak sonuçlanır. İstenen veya olmayan bu olabilir. - Lee Meador


Üyeyi özel yapın ve bir set / getter çifti ekleyin. Setterinizde, boşsa, bunun yerine varsayılan değeri ayarlayın. Ayrıca, iç değer null olduğunda, pasajı getter ile de bir varsayılan döndürmeyi gösterdim.

class JavaObject {
    private static final String DEFAULT="Default Value";

    public JavaObject() {
    }

    @NotNull
    private String notNullMember;
    public void setNotNullMember(String value){
            if (value==null) { notNullMember=DEFAULT; return; }
            notNullMember=value;
            return;
    }

    public String getNotNullMember(){
            if (notNullMember==null) { return DEFAULT;}
            return notNullMember;
    }

    public String optionalMember;
}

2
2017-07-27 18:17



Bu benim için çalışıyor. Teşekkürler - bademba


Benzer bir sorunum vardı, ama benim durumumda varsayılan değer veritabanındaydı. Bunun için çözüm aşağıdadır:

 @Configuration
 public class AppConfiguration {
 @Autowired
 private AppConfigDao appConfigDao;

 @Bean
 public Jackson2ObjectMapperBuilder builder() {
   Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
       .deserializerByType(SomeDto.class, 
 new SomeDtoJsonDeserializer(appConfigDao.findDefaultValue()));
   return builder;
 }

Daha sonra SomeDtoJsonDeserializer kullanım ObjectMapper jsonu deserialize etmek ve alan / nesne null ise varsayılan değeri ayarlamak için.


0
2017-12-26 15:12