0

我正在尝试使用 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);

这是我得到的错误:

com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:95) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write 的线程“主”java.lang.NullPointerException 中的异常(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)

有什么想法吗?

4

1 回答 1

3

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

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

于 2012-12-25T07:36:20.373 回答