gpt4 book ai didi

android - Gson序列化HashMap>

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:53:31 24 4
gpt4 key购买 nike

我有一个 map ,其中一个键的值是一个对象列表。能够通过 builder.enableComplexMapKeySerialization(); 序列化 key 但是这些值没有按预期序列化,因为它们在反序列化时返回字符串而不是对象。

下面是序列化的输出

[{"id":31001,"name":Teacher"]}, //This is the key

[{"id":33033,"name":"student1"}, {"id":34001,"name":"student2"}]], //This is the list of values

我使用了相关的 TypeToken,它是 TypeToken<HashMap<Teacher, List<Student>>>但列表值仍然在反序列化时返回一个字符串而不是对象。

最佳答案

JSON 由名称/值对组成(其中值端可以是事物列表)。其中的名称部分是一个字符串(参见:http://json.org)

您要做的是使用对象作为名称;你不能直接这样做。 JSON 对象不能是名称/值对的名称。

如果您阅读 documentation for enableComplexMapKeySerialization,它会解释生成的 JSON 将是什么。

它生成的 JSON(作为 JSON 数组的 map )将完美地反序列化回您的 map 。以下是一个完整的工作示例 (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

如果您在 Teacher 类中实现了 equals()hashCode(),那么您就可以使用Teacher 从 map 中检索内容:

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);
...

关于android - Gson序列化HashMap<Teacher, List<Student>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14675374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com