2016-04-29 1 views
0

J'ai essayé d'analyser JSON en utilisant customDeserilizer pour la nidification ObjetFail à Parse dynamique KeyValue paire JSON aide personnalisée JsonDeserializer GSON

Voici mon désérialiseur:

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

et je suis en utilisant la ligne de code suivante enregistrer ce désérialiseur

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

Voici ma classe POJO

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

J'obtiens l'erreur suivante

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

Un stacktrace complet serait utile – marthursson

+0

posted piletrace @marthursson –

Répondre

0

C'est une sorte de gâchis. Vous devez vous assurer que tout est lié.

Vous ne faites pas référence à votre MapSerializer (votre implémentation JsonDeserializer) partout. Vous faites référence à quelque chose appelé ArrayOfObjectsToMapDeserializer lors de la construction de votre GsonBuilder. En outre, lors de la construction du constructeur, vous faites référence à TaggedActorMap.class, mais vous essayez de désérialiser une classe nommée SimilarActivityBean.

Vous n'êtes pas inscrit une désérialiseur personnalisée pour SimilarActivityBean, donc je devine gson essaie de désérialiser le JSON en utilisant certains désérialiseur par défaut, à défaut, car les données du JSON réelle ne correspond pas aux champs SimilarActivityBean

+0

SimillarActivityBean est une classe de base et je dois implémenter JsonDeserializer uniquement pour TaggedActorBean qui est imbriqué dans SimillarActivityBean, je ne sais pas comment enregistrer deserializer avec Classes, –