2016-04-29 58 views
0

我試圖解析使用customDeserilizer JSON嵌套對象無法解析動態密鑰值對JSON使用自定義JsonDeserializer GSON

這裏是我的解串器:

class MapDeserializer implements JsonDeserializer<Map<String, String>> { 

    public Map<String, String> deserialize(JsonElement json, Type typeOfT, 
              JsonDeserializationContext context){ 
     try { 
     Map<String, String> result = new HashMap<String, String>(); 
     JsonObject object = json.getAsJsonObject(); 
      for (Map.Entry<String, JsonElement> entry : object.entrySet()) { 
       String key = entry.getKey(); 
       String value = entry.getValue().getAsString(); 
       result.put(key, value); 
      } 
    // } 
      return result; 
     }catch (Exception e){ 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

,我使用的代碼下面一行註冊該解串器

 Gson gson = new   GsonBuilder().registerTypeHierarchyAdapter(TaggedActorMap.class, new MapDeserializer()).create(); 
        sActivityBean = gson.fromJson(result, 
          SimilarActivityBean.class); 

這裏是我的POJO類

public class TaggedActorMap implements Serializable { 
private String key; 
private String value; 
    } 

我收到以下錯誤

java.lang.IllegalArgumentException: invalid value for field 
    at java.lang.reflect.Field.setField(Native Method) 
    at java.lang.reflect.Field.set(Field.java:588) 
    at  com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1 
    .read(ReflectiveTypeAdapterFactory.java:119) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter 
    .read(ReflectiveTypeAdapterFactory.java:217) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper. 
    read(TypeAdapterRuntimeTypeWrapper.java:40) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter. 
    read(CollectionTypeAdapterFactory.java:81) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter. 
    read(CollectionTypeAdapterFactory.java:60) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1. 
    read(ReflectiveTypeAdapterFactory.java:117) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter. 
    read(ReflectiveTypeAdapterFactory.java:217) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1. 
    read(ReflectiveTypeAdapterFactory.java:117) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter 
.read(ReflectiveTypeAdapterFactory.java:217) 
    at com.google.gson.Gson.fromJson(Gson.java:814) 
    at com.google.gson.Gson.fromJson(Gson.java:779) 
    at com.google.gson.Gson.fromJson(Gson.java:728) 
    at com.google.gson.Gson.fromJson(Gson.java:700) 
+0

匹配字段一個完整的堆棧跟蹤會有所幫助 – marthursson

+0

posted stacktrace @marthursson –

回答

0

這是怎樣的一個爛攤子。你需要確保一切都結合在一起。

你不是指任何地方你的MapSerializer(你的JsonDeserializer實施)。在構建您的GsonBuilder時,您指的是ArrayOfObjectsToMapDeserializer。此外,在構建構建器時,請參考TaggedActorMap.class,但您試圖對名爲SimilarActivityBean的類進行反序列化。

您還未註冊SimilarActivityBean任何自定義解串器,所以我猜GSON嘗試使用一些默認的解串器反序列化JSON的,失敗,因爲在實際的JSON數據不SimilarActivityBean

+0

SimillarActivityBean是基類,我需要實現JsonDeserializer僅用於嵌套在SimillarActivityBean中的TaggedActorBean,我不知道如何用Classes註冊反序列化器, –