【问题标题】:Object of class containing AtomicInteger's fails to be converted to JSON using GSON包含 AtomicInteger 的类的对象无法使用 GSON 转换为 JSON
【发布时间】:2016-10-25 15:17:28
【问题描述】:

我正在尝试序列化一个类对象(比如说 MyClass)

MyClass.java 大致如下:

public class MyClass {

    private static final AtomicInteger variableOne = new AtomicInteger();
    private static final AtomicInteger variableTwo = new AtomicInteger();
    private static final AtomicInteger variableThree = new AtomicInteger();
    private static final AtomicInteger variableFour = new AtomicInteger();


    /*
    * Have the getters and setters here
    */
}

我正在尝试使用 GSON 将上述类的对象转换为 JSON

代码如下:

GsonBuilder gsonBuilder  = new GsonBuilder();
gsonBuilder.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT);
Gson gson = gsonBuilder.create();
String jsonObject = gson.toJson(new MyClass());

但它会抛出以下异常:

class java.util.concurrent.atomic.AtomicInteger declares multiple JSON fields named serialVersionUID

我不确定如何处理这个问题,因为 S.O 和其他论坛上的大多数答案都要求将变量 TRANSIENT 设为 TRANSIENT,而这基本上不是我想要实现的目标。

【问题讨论】:

  • 我使用的是 gson 2.2.1
  • 请贴出你要序列化的整个类
  • 请把它当作整个班级。我只更改了变量的名称并隐藏了 getter 和 setter。
  • 我使用的是 2.6.1 版本,它没有抛出这个异常。
  • @notionquest 可能是该版本默认忽略了serialversionUID。不确定,但我无法更改版本,因为我无法控制 pom.xml,所以必须坚持使用 2.2.1

标签: java json gson atomicinteger


【解决方案1】:

对于遇到此类问题的任何人,我都找到了答案:

使用 FieldExcluder 注册您的 GsonBuilder(我已将其命名为 FieldExtractor)

GsonBuilder gsonBuilder = new GsonBuilder().setExclusionStrategies(new FieldExtractor()); 

FieldExcluder 看起来像:

 private class FieldExtractor implements ExclusionStrategy {

            @Override
            public boolean shouldSkipClass(Class<?> arg0) {
                return false;
            }

            @Override
            public boolean shouldSkipField(FieldAttributes f) {

                if ("serialVersionUID".equals(f.getName())) {
                    return true;
                }

                return false;
            }

        }

基本上你可以忽略任何给你异常的字段,格式如下:

declares multiple JSON fields named serialVersionUID

您可以进一步修改 if 条件以进一步满足您的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多