【问题标题】:GSON on generic types (Java Collection)泛型类型的 GSON(Java 集合)
【发布时间】:2012-12-25 07:22:13
【问题描述】:

我正在尝试使用 Gson 保存类的对象,但不幸的是它不起作用。 我的班级正在使用 ArrayList 实现 Collection 接口。当我尝试获取 json 字符串时,我得到了一个丑陋的错误。这是一些代码:

public class Prob1<T> implements Collection<T>{


    ArrayList<T> alb = new ArrayList<>();

    @Override
    public boolean add(T e) {
        // TODO Auto-generated method stub
        alb.add(e);
        return false;
    }

    @Override
    public boolean addAll(Collection<? extends T> c) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void clear() {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean contains(Object o) {
        // TODO Auto-generated method stub
        return alb.contains(o);
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isEmpty() {
        // TODO Auto-generated method stub
        return alb.isEmpty();
    }

    @Override
    public Iterator<T> iterator() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean remove(Object o) {
        // TODO Auto-generated method stub
        alb.remove(o);
        return false;
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public int size() {
        // TODO Auto-generated method stub
        return alb.size();
    }

    @Override
    public Object[] toArray() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public <T> T[] toArray(T[] a) {
        // TODO Auto-generated method stub
        return null;
    }
    public String toString() {
        return alb.toString();
    }
}

这是我尝试使用 GSon 获取 JSON 字符串:

Prob1 p = new Prob1<String>();
    p.add("Johny");
    p.add("Albus");
    p.add("Sirrius");
    System.out.println(p);

    Gson gson = new Gson();
    String json = gson.toJson(p);

这是我得到的错误:

线程“main”中的异常 java.lang.NullPointerException 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:95) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 在 com.google.gson.Gson.toJson(Gson.java:586) 在 com.google.gson.Gson.toJson(Gson.java:565) 在 com.google.gson.Gson.toJson(Gson.java:520) 在 com.google.gson.Gson.toJson(Gson.java:500) 在 Prob1.main(Prob1.java:104)

有什么想法吗?

【问题讨论】:

  • 问题不在于 Gson,而在于您的 Collection 实现(下面的答案暗示了这一点)。您不能从iterator() 返回null。 Gson 没有问题序列化/反序列化集合,只要它们被正确编写并遵守接口。
  • 另外......你确定你应该使用ArrayList吗?那Collection。如果是这种情况,您可以简单地从其 iterator() 方法中返回 Iterator

标签: java gson


【解决方案1】:

您创建的集合违反了interface 的约定。这是在您的班级用户中获得奇怪行为的秘诀。我检查了 Gson 源,特别是对于您的情况,它看起来像是进入了 NullPointerException,因为您在 iterator() 方法中返回 null。

我不确定您为什么要创建自己的 Collection 类,以及您是否真的需要这样做。如果你这样做,我建议你从 Google guava 扩展 ForwardingCollection,并且只覆盖你真正需要覆盖的方法。

【讨论】:

  • 我必须使用 ArrayList 来实现 Collection 类以完成家庭作业,并且我需要能够仅添加相同类的对象(这就是我使用泛型类型的原因)。如果我使用 ForwardingCollection,我将能够使用 GSON?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多