Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从json转换为vector后,元素未从vector中移除_Java_Android_Json_Vector_Gson - Fatal编程技术网

Java 从json转换为vector后,元素未从vector中移除

Java 从json转换为vector后,元素未从vector中移除,java,android,json,vector,gson,Java,Android,Json,Vector,Gson,我有这样一个数据模型: public class Person { String name = ""; Integer id; public Person() { name = ""; id = new Integer(0); } } 首先,我创建了两个对象并添加到一个向量中。将向量转换为json字符串。在再次进行一些检查之后,我将json字符串转换为vector。在

我有这样一个数据模型:

    public class Person {
        String name = "";
        Integer id;
        public Person() {
            name = "";
            id = new Integer(0);
        }
    }
首先,我创建了两个对象并添加到一个向量中。将向量转换为json字符串。在再次进行一些检查之后,我将json字符串转换为vector。在向量中,它显示了正确数量的元素和数据。但当我试图得到一个物体的位置时,它返回-1。即使使用vector.remove()我也无法删除该对象。如果我不将向量转换为json字符串,它就可以正常工作。以下是我的代码:

        Gson gson = new Gson();
        Vector vecResult = new Vector();

        Person person = new Person();
        person.name = "ABC";
        person.id = new Integer(1001);

        vecResult.add(person);

        Person person2 = new Person();
        person2.name = "DEF";
        person2.id = new Integer(1002);

        vecResult.add(person2);

        String json = gson.toJson(vecResult); //successful

        Type token = new TypeToken<Vector<Person>>() {}.getType();
        Vector<Person> vecResults = gson.fromJson(json3, token); //vecResults got 2 objects
        int pos = vecResults.indexOf(person); //returning -1
        boolean isRemoved = vecResults.remove(person); // returning false
Gson-Gson=new-Gson();
Vector vecResult=新向量();
Person=新人();
person.name=“ABC”;
person.id=新整数(1001);
vecResult.添加(个人);
Person person2=新的Person();
person2.name=“DEF”;
person2.id=新整数(1002);
vecResult.add(person2);
字符串json=gson.toJson(vecResult)//成功的
Type token=new-TypeToken(){}.getType();
Vector vecResults=gson.fromJson(json3,令牌)//结果得到2个对象
int pos=vecResults.indexOf(个人)//返回-1
布尔值isRemoved=vecResults.remove(person);//返回错误

您需要覆盖以下内容

boolean equals(Object obj) 
int     hashCode()
您的代码不起作用,因为
Vector#remove
使用以下方法获取索引

public synchronized int indexOf(Object o, int index) {
    if (o == null) {
        for (int i = index ; i < elementCount ; i++)
        if (elementData[i]==null)
            return i;
    } else {
        for (int i = index ; i < elementCount ; i++)
        if (o.equals(elementData[i]))
            return i;
    }
    return -1;
    }

您的
Person
类不会重写
equals()
(或
hashCode()

当您序列化为JSON然后反序列化时,将创建
Person
的新实例,就
indexOf
remove
而言,这些实例与原始实例完全不同。它们碰巧具有相同的
名称
id
值,但这并不自动使它们相等

覆盖
Object.equals()
Object.hashCode()
以获得您想要的任何平等含义(只是名称?只是ID?两者都有?),应该可以

请注意,通常最好将字段设置为私有,并提供属性getter/setter。

remove()尝试通过equals()方法来loacte对象。默认情况下,这是对象标识。为person生成一个显式的equals()方法(在eclipse中,您可以使用所有字段生成一个)。 (重写equals()时,还需要有一个匹配的hashcode()方法)

public boolean equals(Object obj) {
    return (this == obj);
    }