该文章翻译自Gson Tutorial Series系列教程。该篇主要阐述了如何使用Gson映射Sets。
序列化Java Sets
Java的集合框架包括大量的数据结构。我们已经讨论过lists和maps,它们在JSON的表达中有些许不同。这周,我们探究Sets。HashSet可以使你的数据集合例子中的值保持唯一性。因为sets有其存在的理由并且应用有现实世界,Gson也需要有能力去处理它们。
因此,让我们来看这样一个例子。你的app拥有这样一个功能,可以使得众多的用户可以加入到一个团队中。当然,每一个用户只能加入一次,因此我们使用HashSet去保存用户的名字。
使用Java的实现如下:
HashSet<String> users = new HashSet<>();
users.add("Christian");
users.add("Marcus");
users.add("Norman");
users.add("Marcus"); // would not be added again
sets的序列化和其他类型是一样的。你仅仅需要把它扔给Gson:
Gson gson = new Gson();
String usersJson = gson.toJson(users);
结果如下所示:
[
"Marcus",
"Christian",
"Norman"
]
正如你所看到的,JSON采用和list一样的表达方式来表达set。是的,Java处理二者之间的内在逻辑是完全不同的,但是对于高层来说,它们存储相同的数据。对于如JSON这样的不管如何实现的语言来说,内在细节是无关紧要的。
反序列化Java Sets
正如我们上面所提到的,lists和sets在JSON中的表达都是相同的。因此,因此,Gson乐意将一个宽泛的JSON反序列化为上面的无论哪一种数据类型。还记得之前的flowerCount例子吗?在我们可以使用JSON转换为无论哪一种之前,我们先查看一下:
[
{
"name": "Christian",
"flowerCount": 1
},
{
"name": "Marcus",
"flowerCount": 3
},
{
"name": "Norman",
"flowerCount": 2
}
]
和处理lists是一样的。我们为Gson创建一个Type,然后让它来施展它的魔术:
String founderJson = "[{'name': 'Christian','flowerCount': 1}, {'name': 'Marcus', 'flowerCount': 3}, {'name': 'Norman', 'flowerCount': 2}]";
Gson gson = new Gson();
Type founderSetType = new TypeToken<HashSet<Founder>>(){}.getType();
HashSet<Founder> founderSet = gson.fromJson(founderJson, founderSetType);
founderSet变量拥有和之前博客中相同的内容,仅仅是数据类型不同而已:
网友评论