类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);