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

}

B 类有一些属于 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 类的对象

原文由 Java Questions 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 733
2 个回答

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

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

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

 private transient BigDecimal tradeFeesPcy;

原文由 gerrytan 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

希望这对某人有帮助!

原文由 Adrian Lee 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题