la classe A déclare plusieurs champs JSON

J’ai une classe A qui a des champs privés et la même classe étend une autre classe B qui a aussi des champs privés qui sont dans la classe A.

public class A extends B { private BigDecimal netAmountTcy; private BigDecimal netAmountPcy; private BigDecimal priceTo; private Ssortingng segment; private BigDecimal taxAmountTcy; private BigDecimal taxAmountPcy; private BigDecimal tradeFeesTcy; private BigDecimal tradeFeesPcy; // getter and setter for the above fields } 

et la classe B a des fiedls privés qui sont en classe A

maintenant, quand j’essaie de créer une chaîne JSON de la classe A ci-dessus, j’obtiens l’exception suivante:

 class com.hexgen.ro.request.A declares multiple JSON fields named netAmountPcy 

Comment régler ceci?

Comme ce sont des champs privés, il ne devrait y avoir aucun problème lors de la création de la chaîne json, mais je ne suis pas sûr.

Je crée une chaîne json comme suit:

 Gson gson = new Gson(); tempJSON = gson.toJson(obj); 

ici obj est l’object de la classe A

Comme ce sont des champs privés, il ne devrait y avoir aucun problème lors de la création de la chaîne json

Je ne pense pas que cette déclaration soit vraie, GSON examine les champs privés de l’object lors de la sérialisation, ce qui signifie que tous les champs privés de la superclasse sont inclus et que lorsque vous avez des champs avec le même nom, une erreur est générée.

S’il y a un champ particulier que vous ne voulez pas inclure, vous devez le marquer avec transient mot-clé transient , par exemple:

 private transient BigDecimal tradeFeesPcy; 

C’est un peu tard, mais j’ai également rencontré ce même problème. La seule chose était que je n’étais pas capable de modifier la superclasse car ce code n’était pas le mien. La façon dont j’ai résolu ce problème était en créant une stratégie d’exclusion qui ignorait tout champ ayant un champ du même nom présent dans une super-classe. Voici mon code pour cette classe:

 public class SuperclassExclusionStrategy implements ExclusionStrategy { public boolean shouldSkipClass(Class arg0) { return false; } public boolean shouldSkipField(FieldAtsortingbutes fieldAtsortingbutes) { Ssortingng fieldName = fieldAtsortingbutes.getName(); Class theClass = fieldAtsortingbutes.getDeclaringClass(); return isFieldInSuperclass(theClass, fieldName); } private boolean isFieldInSuperclass(Class subclass, Ssortingng fieldName) { Class superclass = subclass.getSuperclass(); Field field; while(superclass != null) { field = getField(superclass, fieldName); if(field != null) return true; superclass = superclass.getSuperclass(); } return false; } private Field getField(Class theClass, Ssortingng fieldName) { try { return theClass.getDeclaredField(fieldName); } catch(Exception e) { return null; } } } 

J’ai ensuite défini les stratégies d’exclusion de sérialisation et de désérialisation dans le générateur comme suit:

  builder.addDeserializationExclusionStrategy(new SuperclassExclusionStrategy()); builder.addSerializationExclusionStrategy(new SuperclassExclusionStrategy()); 

J’espère que cela aide quelqu’un!

Le même message d’erreur se produit également si vous avez des champs différents, mais qu’ils ont le même @SerializedName .

 @SerializedName("date_created") private Date DateCreated; @SerializedName("date_created") private Integer matchTime; 

Faire copier / coller, vous pouvez simplement faire une telle erreur. Alors, examinez la classe et ses ancêtres et vérifiez cela.

Ajoutez les lignes suivantes au bas de proguard.config (si vous utilisez proguard dans le projet)

 -keepclassmembers class * { private ; } 

Dans mon cas, j’étais assez stupide pour enregistrer un adaptateur avec la classe X et essayer de sérialiser depuis Json avec la classe Y:

  final GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Game.class, new TournamentSerializer()); final Gson gson = gsonBuilder.create(); createdTournament = gson.fromJson(jsonResponse.toSsortingng(), Tournament.class); 

Solution pour Kotlin, comme suggéré @ Adrian-Lee, vous devez modifier quelques Null Checks

 class SuperclassExclusionStrategy : ExclusionStrategy { override fun shouldSkipClass(clazz: Class<*>?): Boolean { return false } override fun shouldSkipField(f: FieldAtsortingbutes?): Boolean { val fieldName = f?.name val theClass = f?.declaringClass return isFieldInSuperclass(theClass, fieldName) } private fun isFieldInSuperclass(subclass: Class<*>?, fieldName: Ssortingng?): Boolean { var superclass: Class<*>? = subclass?.superclass var field: Field? while (superclass != null) { field = getField(superclass, fieldName) if (field != null) return true superclass = superclass.superclass } return false } private fun getField(theClass: Class<*>, fieldName: Ssortingng?): Field? { return try { theClass.getDeclaredField(fieldName) } catch (e: Exception) { null } } }