2016-12-01 2 views
1

Я пытаюсь десериализации следующую структуруDeserialize вложенная объект GSON

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

другие действующие структуры являются

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

и

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

У меня есть эти классы

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


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

и обычай десериализатор

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); 
} 

Тогда я пытаюсь применить deserilizer:

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

Но я получаю ошибку синтаксического анализа, потому что пытаются десериализация данных вместо метаданных, как я могу применить этот десериализатор, чтобы он работал правильно?

ответ

2

я решил его создать десериализатор для моего класса данных.

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; 
    } 



} 

И

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

Довольно очевидно, но есть более элегантное решение?

0

Во-первых, переименуйте класс в мета вместо метаданных и создайте ключевые слова String вместо List.Then используйте следующее, чтобы сопоставить JSonString с вашим объектом.

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

Для того, чтобы получить только ключевые слова, вам это нужно.

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

ключевых слов является JSONObject не JsonArray, так что вы не можете напрямую сопоставить его на список. Вы можете разделить строку, чтобы получить ключевые слова в массиве.

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

Привет, Умер, создал десериализатор для моего класса. Data решила проблему (назначить собственный десериализатор для вложенного объекта), но я искал решение, подобное аннотации @JsonDeserialize в Джексоне. – Osarez

Смежные вопросы