2016-03-29 30 views
1

için, bir birincil sınıf varJackson Serile Aşağıdaki örnekte alt sınıfları

JSON A:

{ "keys" :{ 
       "primary_key" : "abc" 
      } 
} 

JSON B doğru ilgili sınıfa aşağıdaki json serisini amacıyla polimorfık özelliği

{ "keys" : { 
       "primary_key" : "abc", 
       "secondary_key" : "xyz" 
     } 
    } 

Beklenen Sonuç: Harita tuşları da JSON B.

önermek Lütfen alternatif öneriler için JSON A ve B sınıfı için A sınıfı itiraz ediyorum.

+0

Gerçek ve beklenen sonucun ne olduğu net değil mi? –

+0

@YusufK. İlk jsonu Class A'ya ve ikinci jsonu Class B'ye eşlemek istiyorum. – bin

+0

Her bir jsondan nesne oluşturmak istediğinizi düşünüyorum? –

cevap

0

Doğru şekilde altını çizersem, değerleri geçmeden herhangi bir yapılandırma yapmadan çalışır. Bunun aradığınız budur inanıyoruz:

public class Test { 

    private static final String JSON = "{\"keys\":{\"primary_key\":\"abc\",\"secondary_key\":\"xyz\"}}"; 

    public static void main(String[] args) throws IOException { 

     ObjectMapper mapper = new ObjectMapper(); 
     X x = mapper.readValue(JSON, X.class); 
     System.out.println(mapper.writeValueAsString(x)); 

    } 
} 

class A { 
    private String primary_key; 

    public String getPrimary_key() { 
     return primary_key; 
    } 

    public void setPrimary_key(String primary_key) { 
     this.primary_key = primary_key; 
    } 
} 

class B extends A { 

    private String secondary_key; 

    public String getSecondary_key() { 
     return secondary_key; 
    } 

    public void setSecondary_key(String secondary_key) { 
     this.secondary_key = secondary_key; 
    } 
} 

class X { 

    private B keys; 

    public B getKeys() { 
     return keys; 
    } 

    public void setKeys(B keys) { 
     this.keys = keys; 
    } 
} 

Çıktı olacaktır: durumunda

{"keys":{"primary_key":"abc","secondary_key":"xyz"}} 

bu, başka bir açıklama yapın bekliyoruz ve gerektiğinde cevabı düzenleyeceksiniz şey değildir.

+0

(Belirtilen json "ikincil_anahtarı" içeriyorsa) anahtarının içinde anahtarının X nesnesinin B 'a ait olması gerekir. anahtar nesnesi X'in A'ya ait olması gerekir. – bin

0

Oldukça yaygın bir sorun gibi hissediyor ve orada bunu çözmek için hiç de kolay açıklamalar yoludur (Ya da belki kendimi alamıyorum bulmak):

Jackson Polymorphic Deserialization - Can you require the existence of a field instead of a specific value?

Deserializing polymorphic types with Jackson

bir şey Yapabileceğiniz Nesne eşleştiricinize özel deserializer eklemektir. https://stackoverflow.com/a/19464580/1032167 İşte

demo sizin örnek ile ilgilidir: Burada bu yaklaşımın güzel demo

import com.fasterxml.jackson.annotation.*; 
import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.core.ObjectCodec; 
import com.fasterxml.jackson.databind.*; 
import com.fasterxml.jackson.databind.module.SimpleModule; 

import java.io.IOException; 

public class Main4 { 


private static final String jsonA = "{ \"keys\" : { \"primary_key\" : \"abc\" } }"; 
private static final String jsonB = 
     "{ \"keys\" : { \"primary_key\" : \"abc\", \"secondary_key\" : \"xyz\" } }"; 

public static void main(String[] args) throws IOException { 
    ObjectMapper mapper = new ObjectMapper(); 

    SimpleModule idAsRefModule = new SimpleModule("ID-to-ref"); 
    idAsRefModule.addDeserializer(A.class, new AJsonDeserializer()); 
    mapper.registerModule(idAsRefModule); 

    X tl = mapper.readValue(jsonA, X.class); 
    System.out.println(tl); 

    X t2 = mapper.readValue(jsonB, X.class); 
    System.out.println(t2); 
} 

public static class AJsonDeserializer extends JsonDeserializer<A>{ 

    @Override 
    public A deserialize(JsonParser jp, DeserializationContext dc) 
    throws IOException { 

     ObjectCodec codec = jp.getCodec(); 
     JsonNode node = codec.readTree(jp); 

     if (node.has("secondary_key")) { 
      return codec.treeToValue(node, B.class); 
     } 
     return new A(node.findValue("primary_key").asText()); 
    } 
} 

public static class A 
{ 
    @JsonProperty("primary_key") 
    public final String primaryKey; 

    @JsonCreator 
    A(@JsonProperty("primary_key") String primaryKey) 
    { 
     this.primaryKey = primaryKey; 
    } 

    @Override 
    public String toString() { 
     return "A{" + 
       "primaryKey='" + primaryKey + '\'' + 
       '}'; 
    } 
} 

public static class B extends A 
{ 
    @JsonProperty("secondary_key") 
    public final String secondaryKey; 

    @JsonCreator 
    B(@JsonProperty("primary_key") String primaryKey, 
     @JsonProperty("secondary_key") String secondaryKey) 
    { 
     super(primaryKey); 
     this.secondaryKey = secondaryKey; 
    } 

    @Override 
    public String toString() { 
     return "B{" + 
       "primaryKey='" + primaryKey + '\'' + 
       "secondaryKey='" + secondaryKey + '\'' + 
       '}'; 
    } 
} 

public static class X 
{ 
    @JsonProperty("keys") 
    public final A keys; 

    @JsonCreator 
    X(@JsonProperty("keys") A keys) 
    { 
     this.keys = keys; 
    } 

    @Override 
    public String toString() { 
     return "X{" + 
       "keys=" + keys + 
       '}'; 
    } 
} 
} 

Ama bir deserializer varsayılan kullanabilir veya bakmak isterseniz bir daha süper sınıf oluşturmak zorunda kalacak Burada bunu nasıl çözebilirsiniz: https://stackoverflow.com/a/18405958/1032167