2016-12-01 5 views
1

Ich versuche, die folgende StrukturDeserialize verschachteltes Objekt mit Gson

{ meta: { keywords: [a, b, c, d]} ... } 

andere gültige Strukturen zu deserialisiert sind

{ meta: { keywords: "a,b,c,d"} ... } 

und

{ meta: {keywords: "a"} ...} 

Ich habe diese Klassen

public class Data { 
    @PropertyName("meta") 
    MetaData meta; 
    ... 
} 


public class MetaData { 
    List<String> keywords; 
    ... 
} 

und ein benutzerdefinierter Deserializer

public static class CustomDeserilizer implements JsonDeserializer<MetaData>{ 
    @Override 
    public MetaData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     List<String> keywords = null; 
     Gson gson = new Gson(); 
     MetaData metaData = gson.fromJson(json, AppMetaData.class); 
     JsonObject jsonObject = json.getAsJsonObject(); 

     if (jsonObject.has("keywords")) { 
      JsonElement elem = jsonObject.get("keywords"); 
      if (elem != null && !elem.isJsonNull()) { 

       if (jsonObject.get("keywords").isJsonArray()) { 
        keywords = gson.fromJson(jsonObject.get("keywords"), new TypeToken<List<String>>() { 
        }.getType()); 
       } else { 
        String keywordString = gson.fromJson(jsonObject.get("keywords"), String.class); 
        keywords = new ArrayList<String>(); 
        list.addAll(Arrays.asList(keywordString.split(","))); 
       } 
      } 
     } 
     metaData.setKeywords(keywords); 
} 

Dann versuche ich, die deserilizer anwenden:

Gson gson = new GsonBuilder()    
     .registerTypeAdapter(Data.class,new CustomDeserilizer())    
     .create(); 

Aber ich einen Parsing-Fehler erhalten, weil versucht, Daten statt MetaDaten deserialisiert, wie kann ich mich bewerben dieser Deserializer, damit es richtig funktioniert?

Antwort

2

Ich löste es einen Deserializer für meine Klasse Daten zu schaffen.

public static class DataDeserilizer implements JsonDeserializer { 
    @Override 
    public Data deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 

     Gson gson = new Gson(); 
     Data data = gson.fromJson(json, Data.class); 
     JsonObject jsonObject = json.getAsJsonObject(); 
     if (jsonObject.has("meta")) { 
      JsonElement elem = jsonObject.get("meta"); 
      if (elem != null && !elem.isJsonNull()) { 

       Gson gsonDeserializer = new GsonBuilder() 
         .registerTypeAdapter(MetaData.class, new CustomDeserilizer()) 
         .create(); 
       gsonDeserializer.fromJson(jsonObject.get("meta"), Data.class); 
      } 
     } 

     return data; 
    } 



} 

Und

Gson gson = new GsonBuilder()    
    .registerTypeAdapter(Data.class,new DataDeserilizer())    
    .create(); 

ziemlich offensichtlich, aber gibt es eine elegantere Lösung?

0

Benennen Sie zuerst Ihre Klasse in Meta anstelle von Metadaten um und machen Sie Schlüsselwörter String anstelle von List. Verwenden Sie dann Folgendes, um Ihren JSonString in Ihr Objekt zu mappen.

Gson gson = new GsonBuilder().create(); 
Meta meta = gson.from(yourJsonString,Meta.class); 

Um nur Keywords zu erhalten, benötigen Sie dies.

JsonObject jsonObject = new JsonObject(yourJSonString); 
String data = jsonObject.getJsonObject("meta").getString("keywords"); 

Schlüsselwörter ist ein JsonObject kein JsonArray so können Sie es nicht direkt auf Liste Karte. Sie können die Zeichenfolge teilen, um Schlüsselwörter in einem Array abzurufen.

String keywords[] = data.split(","); 
+0

Hallo Umer, erstellt der Deserializer für meine Klasse Daten löste das Problem (zuweisen Sie einen benutzerdefinierten Deserializer für ein verschachteltes Objekt), aber ich suchte nach einer Lösung wie der @ JsonDeserialize Annotion in Jackson. – Osarez

Verwandte Themen