2017-12-25 5 views
0

Lets sagen, dass ich eine Gruppe von Klassen A, B, C:Gson - deserialisieren unbekannte Klassen

public class A: int-Nummer;

öffentliche Klasse B: Int-Nummer; Stringadresse;

öffentliche Klasse C: int orderNumber;

Wie kann ich eine JSON-Zeichenfolge deserialisieren, die nur diese Klassen enthält, aber in einer unbekannten Reihenfolge (mit Gson, in Java)? Zum Beispiel:

{//A 
"number" : 3 
} 
//C 
{ 
"orderNumber": 10 
} 
//B 
{ 
"number" : 5 
"address" : "New York" 
} 
//C 
{ 
"orderNumber": 1 
} 

Vielen Dank!

+0

Ich denke, Sie sollten zuerst die Json-Payload in eine allgemeine Struktur (wie JsonNode in Jackson) konvertieren und dann entscheiden, auf welche Klasse Sie es werfen möchten. –

+0

Sie können JSON als hashmap deserialisieren – user1516873

Antwort

0

Dies ist keine allgemeine oder überhaupt eine großartige Strategie, um dies im Allgemeinen zu tun, wenn Sie komplexere Klassen mit mehr Feldern haben.

Aber wenn die Klassen, die Sie deserialisieren wollen, sind so einfach, wie Sie als ein Beispiel liefern dann eine Klasse erstellen, alle diese Felder

mit
@Getter 
public class Z { 
    private Integer orderNumber; 
    private Integer number; 
    private String address; 
} 

Sie erhalten eine Liste von Z s erhalten und je nach der dem Feld sind null oder nicht null können Sie - wenn benötigt - später bauen A, B oder C von Z.

Wenn Klassen zum Deserialisieren komplexer sind, müssen Sie sowieso eine Art Mechanismus erstellen, der bestimmt, welche Klasse analysiert und zurückgegeben werden soll. Es könnte sein, wie user1516873 im Kommentar vorgeschlagen

Collection<Map<String,String>> 

so für jedes Element, das Sie in dieser Karte vorhanden, durch welche Bereiche sind zu bestimmen, müßten in welcher Klasse - A, B oder C - Los aufgebaut werden würde.

0

Antwort von pirho ist sauber und einfach, wenn, wie er sagte, Ihre Klassen sind einfach, wie Sie angegeben haben. Aber wenn das nicht der Fall ist, können Sie Ihren eigenen Deserializer schreiben.

public class PayloadJsonDeserializer implements JsonDeserializer { 
    @Override 
    public Object deserialize(JsonElement elm, Type type, JsonDeserializationContext context) throws JsonParseException { 
     // create java objects based on the properties in the json object 
     JsonPrimitive orderNumber = elm.getAsJsonObject().getAsJsonPrimitive("orderNumber"); 
     if(!orderNumber.isJsonNull()) { 
      return new C(orderNumber.getAsInt()); 
     } 

     return null; 
    } 
} 

Registrieren Sie Ihren benutzerdefinierten Deserializer mit Gson.

GsonBuilder gsonBuilder = new GsonBuilder() 
        .registerTypeAdapter(PayloadJson.class, new PayloadJsonDeserializer()); 
Gson gson = gsonBuilder.create(); 

Verwenden Sie es zur Deserialisierung Ihres JSON.

gson.fromJson(jsonString, PayloadJson[].class); 
Verwandte Themen