我有一个类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
}
B类有一些私人FIEDL,属于A类
现在,当我尝试从上面的类A创建JSON字符串时,我得到了以下异常:
class com.hexgen.ro.request.A declares multiple JSON fields named netAmountPcy
如何解决这个问题?
因为它们是私有字段,所以在创建json字符串时应该不会有任何问题,我想,但我不确定。
我创建如下所示的json字符串:
Gson gson = new Gson();
tempJSON = gson.toJson(obj);
这里obj是A类的对象
由于它们是私有字段,因此在创建json字符串时不应该有任何问题
我不认为这种说法是正确的,GSON 在序列化时会查找对象的私有字段,这意味着包含超类的所有私有字段,当您有同名字段时,它会抛出错误。
如果您不想包含任何特定字段,则必须使用transient
关键字对其进行标记,例如:
private transient BigDecimal tradeFeesPcy;
这有点晚了,但我也遇到了这个完全相同的问题。唯一的问题是我无法修改超类,因为该代码不是我的。我解决这个问题的方法是创建一个排除策略,该策略跳过超类中存在同名字段的任何字段。这是我为该类编写的代码:
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;
}
}
}
然后,我在生成器中设置序列化和反序列化排除策略,如下所示:
builder.addDeserializationExclusionStrategy(new SuperclassExclusionStrategy());
builder.addSerializationExclusionStrategy(new SuperclassExclusionStrategy());
希望这对某人有所帮助!
如果您有不同的字段,但它们具有相同的@SerializedName
,也会出现相同的错误消息。
@SerializedName("date_created")
private Date DateCreated;
@SerializedName("date_created")
private Integer matchTime;
进行复制/粘贴,您可能会犯这样的错误。因此,查看该类及其祖先并检查一下。