2016-04-04 6 views
4

Ich verwende Retrofit2 und ich bin gebeten worden, die folgende json zu konsumieren:Retrofit: Deal mit Immobilien, die entweder leeren String oder ein Array sein kann

{ „status“: „Erfolg“, Nutzlast { "prop1": 1234 "prop2": ""}}

Das Problem ist, dass prop2 kann entweder eine leere Zeichenfolge oder ein Array von Objekten. (Leeres Array ist keine Option für sie)

Ich kann mich nicht erinnern, dass Retrofit einen Mechanismus hat, der mit dieser Art von Inkonsistenz umgehen kann. Ich bin auf der Suche nach einem Rezept, um diese Eigenschaft als irgendeine Art von generischem Objekt zu erhalten. Irgendwelche benutzen vielleicht GSon, um es später zu analysieren oder eine andere alternative Möglichkeit, es zum Laufen zu bringen.

+0

Sie immer den Parsing-Typ ein 'com.google.gson.JsonObject' machen könnte. Dann können Sie dann überprüfen, ob prop2 eine 'String' oder eine' JsonArray' – Remco

+0

ist, aber wie überprüfe ich, ob die Eigenschaft in anderen Eigenschaften verschachtelt ist? Irgendwelche Verbindungen, wo ich herausfinden kann? Ich weiß nur, wie man Werte mit Gson prüft, indem man eine Klasse übergibt, um den json in zu konvertieren, aber in diesem Fall kann ich ihm keine Klasse geben – JayJay

Antwort

0

Sie können versuchen, diese zu überprüfen, ob prop2 entweder ein Array oder ein leerer String

JsonObject jsonObject = new Gson().fromJson("{ \"status\":\"success\", \"payload\": { \"prop1\": 1234, \"prop2\": \"\" } }", JsonObject.class); 
JsonObject payload = jsonObject.getAsJsonObject("payload"); 
JsonElement jsonElement = payload.get("prop2"); 
if (jsonElement.isJsonArray()) { 
    // value of prop2 is an array 
} else if (jsonElement.isJsonPrimitive()) { 
    JsonPrimitive jsonPrimitive = jsonElement.getAsJsonPrimitive(); 
    if (jsonPrimitive.isString() && "".equals(jsonPrimitive.getAsString())) { 
     // value of prop2 is an empty String 
    } 
} 
Verwandte Themen