Gson - Map 结构映射_無名無的博客-程序员ITS203

技术标签: gson  技术翻译  

原文链接:Gson — Mapping of Maps
原文出自:Norman Peitek
译者:無名無

在介绍使用 Gson 解析一些基本数据结构之后,我们来看下如何使用Gson 来序列化和反序列化 Java 中的 Map 数据类型。

Java Map 序列化

Java 中的 Map 是一个非常灵活的数据结构,被用在很多场景,使用 Java 可以自由的实现应用。

先来看一个例子,使用 HashMap 实现:

HashMap<String, List<String>> employees = new HashMap<>();
employees.put("A", Arrays.asList("Andreas", "Arnold", "Aden"));
employees.put("C", Arrays.asList("Christian", "Carter"));
employees.put("M", Arrays.asList("Marcus", "Mary"));

序列化过程和其他类型一样,调用 Gson 的 toJson 就可以了,例如:

Gson gson = new Gson();
String employeeJson = gson.toJson(employees);

输出:

{
    "M": [
        "Marcus",
        "Mary"
    ],
    "C": [
        "Christian",
        "Carter"
    ],
    "A": [
        "Andreas",
        "Arnold",
        "Aden"
    ]
}

正如 Java Map 结构一样,每个 Key 对应这个一个集合。

 Java Map 反序列化

和上一篇的 JSON 数据对比,我们发现有些不一样,这里的 key 是变化的,而不像 List 那样是固定的字段名。

{
    "1$": {
       "amount": 1,
        "currency": "Dollar"
    },
    "2$": {
       "amount": 2,
        "currency": "Dollar"
    },
    "3€": {
        "amount": 3,
        "currency": "Euro"
    }
}

Json 数据中包含三个对象,每个对象有自己的值,但是我们发现 Json 数据更像一个 Map 结构1 ,2  ,3€ 是key

以下是区分 JSON 数据类型的一些简单的方法:

  • 根据你的文档解释或者应用场景
    * 键和值是否是一种类型
  • 键和值是否是动态的

我们假设本例子就是一个map结构的数据,之前我们使用TypeToken来标志过list类型,这里我们需要创建一个map类型的TypeToken类型。

public class AmountWithCurrency {
    String currency;
    int amount;
}

String dollarJson = "{ '1$': { 'amount': 1, 'currency': 'Dollar'}, '2$': { 'amount': 2, 'currency': 'Dollar'}, '3€': { 'amount': 3, 'currency': 'Euro'} }";

Gson gson = new Gson();

Type amountCurrencyType = new TypeToken<HashMap<String, AmountWithCurrency>>(){}.getType();

HashMap<String, AmountWithCurrency> amountCurrency =
gson.fromJson(dollarJson, amountCurrencyType);

Debug 如下:

amountCurrency

嵌套的 Map

Map 数据结构没有根元素,如 “[“,我们就可以像解析 List 那用解析嵌套的 Map。

总结

学习使用 Gson 来序列化和反序列化 Map 结构,下一篇我们将介绍一种类似的数据结构。

你可以通过评论或twitter @futurestud_io 反馈你的问题。

练习代码已上传 Github https://github.com/whiskeyfei/Gson-Review 可自行查看。

Gson 系列文章翻译回顾

1、Gson - Java-JSON 序列化和反序列化入门
2、Gson - 映射嵌套对象
3、Gson - Arrays 和 Lists 映射对象
4、Gson - Map 结构映射
5、Gson - Set 集合映射
6、Gson - 空值映射
7、Gson Model Annotations - 如何使用 @SerializedName 更改字段的命名
8、Gson Model Annotations - @SerializedName 匹配多个反序列化名称
9、Gson Builder - 基础和命名规则
10、Gson Builder - 序列化空值
11、Gson Builder - 忽略策略
12、Gson Builder - Gson Lenient 属性
13、Gson Builder - 特殊类型 Floats & Doubles
17、Gson Builder - 如何使用 @Expose 忽略字段
19、Gson Advanced - 映射枚举类型
20、Gson Advanced - 映射循环引用
21、Gson Advanced - 泛型
22、Gson Advanced - 简单自定义序列化 (Part 1)
24、Gson Advanced - 自定义反序列化基础
25、Gson Advanced - 自定义对象实例创建
26、Gson Advanced - 通过 @JsonAdapter 自定义(反)序列化过程
32、Practical Gson - 如何解析多态对象

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cpfdpzc/article/details/53509314

智能推荐

如何培养科研人员的科研思维,加入相关课程组?_科研小白 新人上路的博客-程序员ITS203

python matlab 深度学习 人工智能 科研可视化 图像处理 科研绘图 AI 课题组 神经网络、支持向量机、决策树、随机森林 群优 化算法,如遗传算法、蚁群算法、蝙蝠算法 心电、肌电、血压、血氧饱和度、惯性传感器等 生理信号采集 成分分析、随机投影、互信息、 非负矩阵分解、稀疏优化...

软件上线后翻车?教你如何化解!(绝密)_weixin_48048408的博客-程序员ITS203

导读:从事IT互联网的人都知道,bug是程序员和测试人员最不喜欢面对的东西,很多人对于软件中出现bug这个事情,第一想到的就是测试人员的问题,因为他们都觉得这是测试人员没有测试出软件中存在的bug,其实,出现bug这种情况是由很多原因造成的,不仅仅是测试人员一方的问题,切记不要把锅全部甩给测试!出现bug在所难免,也并不可怕,可怕的是互相甩锅推卸责任,导致bug一直留在那里造成其他更大的负面影响和损失。软件中bug的出现还有其他原因:比如产品原型不清楚,有歧义。导致产品经理跟客户之间是有歧...

如何让自己像打王者荣耀一样发了疯、拼了命的学习?(转)_weixin_30244889的博客-程序员ITS203

转https://blog.csdn.net/dataiyangu/article/details/97544551阶段性反馈机制(如何持之以恒、让自己发疯)反馈机制是王者荣耀的核心武器,击杀野怪获得金币,不断地努力,获得奖励是我们不断的玩这个游戏的主要原因,也是人的本能,我什么都得不到凭什么这么做?,对记得初二的时候,父亲说如果你能考全校第三我就给你买一台电脑,当时我从全校...

UCenter uc_user_synlogin同步登陆返回值为空(NULL)的解决办法 及 ucenter原理_diankui6178的博客-程序员ITS203

第一种方法最近刚刚接触UCenter,很多问题不是很理解,只是在摸索着、尝试着做,就在刚才有解决了一个问题,虽然不知道解决问题的具体原理,但是还是实现了同步登陆。首先我是在本地测试的,也就是localhost,用uc_user_synlogin会返回一段html代码,这段代码就是实现同步登陆的关键,但是我试了一下,并没有同步成功,具体查看返回的html代码,结果是空的,后来网上找了很多解...

docker容器访问宿主机的mysql_黄宝康的博客-程序员ITS203_docker 宿主mysql

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程我们需要让宿主机的mysql允许远程接入。需要授权,不同版本的mysql授权语句不一样,这个在之前讲过。如下是mysql8.0之前版本的授权语句:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; docker安装的mysql走网桥网络,这样docker容器的mysql就能跟宿主机同一个网络

redis集群哈希一致性算法和哈希槽_我能在河边钓一整天的鱼的博客-程序员ITS203

先说普通哈希算法:让数据id的哈希值和redis集群的个数取模,得到的是几这个数据就存放在哪个redis服务器上普通哈希算法存在数据迁移的问题,即当集群数量增加或减少,原来数据的key与Redis序号对应的集群关系会改变,可能第一次数据1落在0号Redis上,第二次数据1就落在了2号机器上。这样就会出现”缓存穿透“一致性哈希算法一致性哈希算法首先弄了一个虚拟环,环上有n个节点,比如2的32次方个节点。这个环仅仅是逻辑上的一个算法。它先用redis机器序号+redis的ip生成唯一的一...

随便推点

VC程序中如何调用CHM帮助文件_l344438713的博客-程序员ITS203

一. CHM帮助文件的制作(1):下载并安装HTML Help Workshop;(2):制作CHM文件,用HTML标识语言.二. 在VC中使用CHM帮助文件(1)VC编译环境配制要成功调用CHM文件,还必须在VC开发环境中将HtmlHelp.h和HtmlHelp.lib加入工程中,具体步骤如下: Project-&amp;gt;Settings(Alt+F7)。1、在C/C++选项卡的Category的...

根据子节点递归查找所有父节点ID_jannedarc_ruler的博客-程序员ITS203_递归找到父级id

递归获取所有父节点测试用例:参数说明:id为当前节点id;list为所有节点对像 @Override public List&lt;String&gt; queryParentIds(String id, List&lt;TaxCompany&gt; taxCompanyList) { //递归获取父级ids,不包含自己 List&lt;String&gt; parentIds = new ArrayList&lt;&gt;(); this.g

[转]MPI cluster技术简介与鸟哥的架设实例_安嘉的博客-程序员ITS203

MPI简介   MPI(Message Passing Interface)是消息传递并行程序设计的标准之一,当前通用的是MPI1.1规范。正在制定的MPI2.0规范除支持消息传递外,还支持MPI的I/O规范和进程管理规范。MPI正成为并行程序设计事实上的工业标准。  MPI的实现包括MPICH、LAM、IBM MPL等多个版本,最常用和稳定的是MPICH,曙光天潮系列的MPI以M

源码阅读_wangx_code的博客-程序员ITS203

我阅读源码的方法:1 官网或者一些博客中找到这里架构图,知道大概结构2 设计思路以及其中的设计模式3 源码debug+类图+时序图

php mysql 下拉菜单,通过PHP从MySql填充下拉菜单_美剧院线的博客-程序员ITS203

I wonder whether someone may be able to help me please.I have a MySql database containing several tables. My question revolves around the use of data from three of these, 'userdetails', 'detectors' an...

20年吐血整理:程序员全栈体系化学习路线与进阶地图_程序猿DD_的博客-程序员ITS203

左耳朵耗子的程序员练级攻略基本上发布完了,全程看下来,不得不说这些文章能看出来,是花了很大的心血,调动了耗子20年软件开发相关工作经验,结合他的亲身经历,分享他一路走来的...

推荐文章

热门文章

相关标签