2016-04-29 26 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注册反序列化器, –