类A声明了多个JSON字段

我有一个A类,有一些私人领域和相同的类延伸另一个B类,也有一些私人领域,在A级。

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

Bclass有Aclass的私人小class

现在当我尝试从类A创buildJSONstring我得到以下exception:

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

如何解决这个问题?

由于他们是私人领域应该不会有任何问题,当我创buildjsonstring,但我不知道。

我创buildjsonstring,如下所示:

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

这里obj是A类的对象

由于它们是私有字段,创buildjsonstring时不应该有任何问题

我不认为这种说法是真实的,GSON在序列化时查找对象的私有字段,这意味着包含所有超类的私有字段,并且当你有相同名字的字段时,它会抛出一个错误。

如果您不想包含任何特定字段,则必须使用transient关键字标记它,例如:

 private transient BigDecimal tradeFeesPcy; 

这有点晚了,但我遇到了同样的问题。 唯一的问题是我无法修改超类,因为这个代码不是我的。 我解决这个问题的方法是通过创build一个排除策略来跳过超类中具有相同名称的字段的任何字段。 这是我的这个类的代码:

 public class SuperclassExclusionStrategy implements ExclusionStrategy { public boolean shouldSkipClass(Class<?> arg0) { return false; } public boolean shouldSkipField(FieldAttributes fieldAttributes) { String fieldName = fieldAttributes.getName(); Class<?> theClass = fieldAttributes.getDeclaringClass(); return isFieldInSuperclass(theClass, fieldName); } private boolean isFieldInSuperclass(Class<?> subclass, String 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, String fieldName) { try { return theClass.getDeclaredField(fieldName); } catch(Exception e) { return null; } } } 

然后在构build器中设置序列化和反序列化排除策略如下:

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

希望这可以帮助别人!

如果您有不同的字段,也会发生同样的错误消息,但它们具有相同的@SerializedName

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

做复制/粘贴你可以简单地犯这样的错误。 所以,和老祖宗一起来看看这个class级,然后检查一下。

在我的情况下,我笨到用X类注册一个适配器,并尝试从Y类序列化Json:

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