0

Ich habe eine Klasse ShopDeserialisieren Arraylist <Interface> mit Gson

public class Shop { 

    private String name; 
    private ArrayList<Fruitable> fruits; 


    public String toJson() { 
    Gson gson = new Gson(); 
    return gson.toJson(this, Shop.class) 
    } 

} 

Apple und Orange sind die beiden Klassen, die Fruitable Schnittstelle implementiert.

Fruitable:

public interface Fruitable { 
    String getColor(); 
} 

Apple:

public class Apple implements Fruitable { 

private int Id;  

@Override 
public String getColor() { 
    return "red"; 
    } 

} 

Orange:

public class Orange implements Fruitable { 

private int Id; 

@Override 
public String getColor() { 
    return "orange"; 
    } 

} 

Ich kann Shop mit GSON serialisieren, jedoch kann ich es nicht richtig deserialisieren.

Wenn ich deserialize, hat die ArrayList<Fruitable> Objekte, aber die Objekte sind null.

Der Grund dafür ist, dass GSON eine konkrete Instanz benötigt, um in das Verzeichnis zu gelangen.

Ich weiß, ich JsonDeserializer in Shop umsetzen können.

Allerdings kann ich einige Deserialisieren Mechanismus implementieren, innerhalb Apple und Orange so werden sie sich deserialisieren?

Wenn das nicht möglich ist, und ich habe einen Deserializer in Shop zu schreiben, kann ich Code schreiben Sie einfach den fruits Eigenschaft deserialisiert und nicht die anderen Eigenschaften, d. GSON wird die übrigen Eigenschaften deserialisieren, wenn sie konkrete Instanzen sind?

Antwort

1

Ok, also solltest du GSON-Anmerkungen verwenden, die dir das Leben sehr erleichtern werden. Ein Beispiel:

public class Deal{ 

    @SerializedName("name") 
    String name; 

    @SerializedName("times") 
    List<DealTime> times; 

} 

Die json zurück kommt, wird dies in etwa aussehen:

{ 
    name:dave, 
    times[ 
    { 
     end:400, 
     start:200 
    }, 
    { 
     end:30, 
     start:500 
    } 
    ] 
} 

Dann Ihre Dealtime-Klasse wird die folgende Voraussetzungen erfüllt sein:

public class DealTime{ 

     @SerializedName("end") 
     int end; 

     @SerializedName("start") 
     int start; 

    } 

Alles, was Sie tun müssen, ist Guss der JSON kommt mit GSON zurück und benutzt das Deal-Objekt. Hoffe, das hilft.

Verwandte Themen