bob*_*obo 6 serialization android gson deserialization
我有一张地图,其中一个键的值是一个对象列表.能够序列化键,builder.enableComplexMapKeySerialization();但值没有按预期序列化,因为它们在反序列化而不是对象上返回一个字符串.
下面是序列化的输出
[{"id":31001,"name":老师"]},//这是关键
[{"id":33033,"name":"student1"},{"id":34001,"name":"student2"}]],//这是值列表
我使用了相关的TypeToken,TypeToken<HashMap<Teacher, List<Student>>>但仍然是列表值在反序列化而不是对象上返回一个字符串.
Bri*_*ach 19
JSON由名称/值对组成(其中值侧可以是事物列表).名称部分是一个字符串(参见:http://json.org)
你要做的是使用一个对象作为名称; 你不能直接这样做.JSON对象不能是名称/值对的名称.
如果您阅读了enableComplexMapKeySerialization的文档,它将解释生成的JSON的内容.
它生成的JSON(Map作为JSON数组)将完全反序列化回您的地图.以下是一个完整的工作示例(Java 7).
请注意,一旦我从JSON反序列化回Java,我就会迭代地图来获取密钥.这是因为没有equals()和hashCode()被覆盖,Teacher无法创建新实例Teacher并使其作为键工作(仅比较参考值).
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class App 
{
    public static void main( String[] args )
    {
        HashMap<Teacher, List<Student>> map = new HashMap<>();
        Teacher t = new Teacher("12345", "Teacher");
        Teacher t2 = new Teacher("23456", "Teacher2");
        ArrayList<Student> list = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            list.add(new Student(String.valueOf(i), "Student" + String.valueOf(i)));
        }
        map.put(t, list);
        map.put(t2, list);
        GsonBuilder builder = new GsonBuilder();
        Gson gson =
            builder.enableComplexMapKeySerialization().setPrettyPrinting().create();
        Type type = new TypeToken<HashMap<Teacher,List<Student>>>(){}.getType();
        String json = gson.toJson(map, type);
        System.out.println(json);
        System.out.println("\nAfter deserialization:");
        HashMap<Teacher, List<Student>> map2 = gson.fromJson(json, type);
        for (Teacher t3 : map2.keySet()) {
            System.out.println(t3.name);
            for (Student s2 : map2.get(t3)) {
                System.out.println("\t" + s2.name);
            }
        }
    }
}
class Teacher {
    public String id;
    public String name;
    public Teacher(String id, String name) {
        this.id = id;
        this.name = name;
    }
}
class Student {
    public String id;
    public String name;
    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }
}
输出:
[
  [
    {
      "id": "12345",
      "name": "Teacher"
    },
    [
      {
        "id": "0",
        "name": "Student0"
      },
      {
        "id": "1",
        "name": "Student1"
      },
      {
        "id": "2",
        "name": "Student2"
      }
    ]
  ],
  [
    {
      "id": "23456",
      "name": "Teacher2"
    },
    [
      {
        "id": "0",
        "name": "Student0"
      },
      {
        "id": "1",
        "name": "Student1"
      },
      {
        "id": "2",
        "name": "Student2"
      }
    ]
  ]
]
After deserialization:
Teacher2
    Student0
    Student1
    Student2
Teacher
    Student0
    Student1
    Student2
如果实现equals(),并hashCode()在你的Teacher类,那么您需要能够使用的新实例Teacher从地图检索的事情:
class Teacher {
    public String id;
    public String name;
    public Teacher(String id, String name) {
        this.id = id;
        this.name = name;
    }
    @Override
    public int hashCode()
    {
        int hash = 3;
        hash = 37 * hash + Objects.hashCode(this.id);
        hash = 37 * hash + Objects.hashCode(this.name);
        return hash;
    }
    @Override
    public boolean equals(Object obj)
    {
        if (obj == null)
        {
            return false;
        }
        if (getClass() != obj.getClass())
        {
            return false;
        }
        final Teacher other = (Teacher) obj;
        if (!Objects.equals(this.id, other.id))
        {
            return false;
        }
        if (!Objects.equals(this.name, other.name))
        {
            return false;
        }
        return true;
    }
}
一旦你有了,你可以这样做:
...
HashMap<Teacher, List<Student>> map2 = gson.fromJson(json, type);
Teacher t = new Teacher("23456", "Teacher2");
List<Student> list = map2.get(t);
...
| 归档时间: | 
 | 
| 查看次数: | 6761 次 | 
| 最近记录: |