Pojo

2015-12-10 27 views
9

'dan değer elde etmek için Jackson'ı kullanmak mümkündür JSON'a serileştirme için bir alan ad verilirken birçok faktör hesaba katılır. Bir pojo'daki bir alanın değerini, bir kez serileştirilecek isme dayanarak almak için bu faktörleri tersten kullanmak mümkün mü? fasulyePojo

public class Bean{ 
    private Bean2 prop; 

    @JsonProperty("property") 
    public Bean2 getProp(); 
} 

Verilen örnek için

, bu verilen prop değerini almak mümkün mü yalnızca yapılandırılmış ObjectMapper, dize "property" ve Bean örneğidir?

Yansıma hakkında bilgi sahibi olduğum için, "prop" veya "getProp"'u alabildiysem çok iyi olurdum.

+1

Elbette, sınıfın alanlarını/getter yöntemlerini listeleyip '@ JsonProperty' öğesini bulun. Yine de, bu çok garip bir ses geliyor, ve özellikle kullanım durumunuzun ne olduğunu açıkladıysanız daha iyi bir seçenek olabilir. – chrylis

+0

Onaylamam için bunu yapmak için iyi bir nedene ihtiyacın var. Jackson gibi araçların noktalarından biri, POJO nesnelerini transfer/DTO'dan kullanmak isteyeceğiniz mantığınızı çözmektir. –

+0

@chrylis Alan adının beklenmedik bir değer olabileceğini göstermek için sadece @ @ JsonProperty özelliğini kullandım, ek açıklama her zaman orada olmayacak. – kag0

cevap

2

Daha sonra, bir Json Dizesi'ne Bean serialize (sadece ObjectMapper.readValue(JsonString, Map.class) diyoruz) bir harita içine aynı Json dize serisini ve sonra Map.get("property") yapabilirsiniz ve senin olabilir.

String property = ((Map<String, Object>)mapper.readValue(mapper.writeValueAsString(bean), Map.class)).get("property").toString(); 
+0

Aslında, mapper.convertValue (bean, Map.class) 'kullanarak bir haritaya doğrudan dönüştürebilirsiniz. Ancak jackson, nesne alanlarını harita olarak kaldırır. Eğer 'prop' türü 'Bean2' ise, mapper.convertValue (bean, Map.class) .get ("prop") 'bir ' döndürecektir. Bir pojo olarak propagandası yapmak istiyorum. – kag0

4

Sen de-serialize olabilir Bean içine JSON Dize verilen: Burada tek liner çözümdür. O zaman get() yöntemini kullanarak özelliği bulabilirsiniz ve bundan sonra treeToValue() yöntemini kullanarak POJO olarak değer alabilirsiniz.

E.g.

 ObjectMapper mapper = new ObjectMapper(); 

     JsonNode rootNode = mapper.readValue(new ObjectMapper().writeValueAsString(bean), JsonNode.class); 

     JsonNode propertyNode = rootNode.get("property"); 

     Class<?> propertyField = null; 

     Field []fields = Bean.class.getDeclaredFields(); 

     for (Field field : fields){ 

      //First checks for field name 
      if(field.equals("property")){ 

       propertyField = field.getType(); 
        break; 
      } 
      else{ 

       //checks for annotation name 
       if (field.isAnnotationPresent(JsonProperty.class) && field.getAnnotation(JsonProperty.class).value().equals("property")) { 
        propertyField = field.getType(); 
        break; 
       } 
       //checks for getters 
       else { 

        PropertyDescriptor pd = new PropertyDescriptor(field.getName(), Bean.class); 

        Method getMethod = pd.getReadMethod(); 

        if (getMethod.isAnnotationPresent(JsonProperty.class) && getMethod.getAnnotation(JsonProperty.class).value().equals("property")) { 

         propertyField = field.getType(); 

         break; 
        } 
       } 
      } 
      } 


     if(propertyField != null){ 

      Object o = mapper.treeToValue(propertyNode, propertyField); 

     } 
+0

Bu işe yarayabilir, ancak 'propertyNode' türünü nasıl bilebilirim?Soruda belirtildiği gibi, sadece yapılandırılmış bir ObjectMapper, "özellik" dizesi ve "Bean" örneğinin var. Bu yüzden, çalışma süresinden önce 'Bean' sınıfı hakkında hiçbir bilgim yok. – kag0

+0

@ kag0 bu durumda, o ismin alan türünü bulmak için yansıma kullanmanız gerekir. Belirli bir mülk adına ait olan türü bulmaya çalıştığım güncellenmiş kodumu kontrol et. –

+0

Yansımayı bu şekilde kullanabileceğimin farkındayım ('PropertyDescriptor' hakkında bilmediğim halde, bu yararlıdır). Tüm yansımayı kendim yapmak yerine Jackson'ı kullanmanın bir yolu olup olmadığını bilmek istiyorum. Ayrıca, json alanı karşılık gelen java alanı olmayan bir alıcıdan geldiyse veya alan devralındıysa, kodunuz çalışmaz. – kag0

İlgili konular