类 A 声明多个 JSON 字段

2022-08-31 11:42:32

我有一个A类,它有一些私有字段,同一个类扩展了另一个B类,该类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类有一些私人Fiedls,属于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 的对象


答案 1

由于它们是私有字段,因此在创建json字符串时应该没有任何问题

我不认为这个陈述是正确的,GSON在序列化时会查找对象的私有字段,这意味着包含超类的所有私有字段,并且当您具有同名的字段时,它会引发错误。

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

private transient BigDecimal tradeFeesPcy;

答案 2

这有点晚了,但我也遇到了同样的问题。唯一的问题是我无法修改超类,因为该代码不是我的。我解决此问题的方法是创建一个排除策略,跳过超类中存在同名字段的任何字段。以下是我为该类编写的代码:

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

希望这对某人有所帮助!