java jsonalias_将多个JSON字段映射到单个Java字段
简介
本文中,教大家如何使用Jackson和Gson将不同的JSON字段映射到单个Java字段中。
Maven依赖
为了使用Jackson和Gson库,我们需要在POM中添加以下依赖项:
com.google.code.gson
gson
2.8.5
test
com.fasterxml.jackson.core
jackson-databind
2.9.8
test
示例JSON
假如,我们希望将不同位置的天气细节输入到我们的Java类中。我们发现了一些将天气数据发布为JSON文档的网站。但是,它们的格式并未是一致的
{
"location": "广州",
"temp": 15,
"weather": "多云"
}
{
"place": "深圳",
"temperature": 35,
"outlook": "晴天"
}
我们希望将这两种格式反序列化为同一个Java类,名为 Weather:
使用Jackson
为实现这一目标,我们将使用Jackson的@JsonProperty和@JsonAlias注释。这两个注解将帮助我们把JSON属性映射到同一Java字段。
首先,我们将使用@JsonProperty注释,以便让Jackson知道要映射的JSON字段的名称。在值@JsonProperty注解同时用于反序列化和序列化。
然后我们可以使用@JsonAlias注释。因此,Jackson将知道JSON文档中映射到Java字段的其他字段的名称。在用了@JsonAlias注释的属性用于反序列化。
@JsonProperty("location")
@JsonAlias("place")
private String location;
@JsonProperty("temp")
@JsonAlias("temperature")
private int temp;
@JsonProperty("outlook")
@JsonAlias("weather")
private String outlook;
Getter、Setter忽略
现在我们已经添加了注释,让我们使用Jackson的ObjectMapper方法创建Weather对象。
@Test
public void test() throws Exception {
ObjectMapper mapper = new ObjectMapper();
Weather weather = mapper.readValue("{\n"
+ " \"location\": \"广州\",\n"
+ " \"temp\": 15,\n"
+ " \"weather\": \"多云\"\n"
+ "}", Weather.class);
TestCase.assertEquals("广州", weather.getLocation());
TestCase.assertEquals("多云", weather.getOutlook());
TestCase.assertEquals(15, weather.getTemp());
weather = mapper.readValue("{\n"
+ " \"place\": \"深圳\",\n"
+ " \"temperature\": 35,\n"
+ " \"outlook\": \"晴天\"\n"
+ "}", Weather.class);
TestCase.assertEquals("深圳", weather.getLocation());
TestCase.assertEquals("晴天", weather.getOutlook());
TestCase.assertEquals(35, weather.getTemp());
}
使用Gson
现在,我们来看看Gson如何实现。我们需要在@SerializedName注释中使用值和 备用参数。
第一个将用作默认值,而第二个将用于指示我们要映射的JSON字段的备用名称:
@SerializedName(value="location", alternate="place")
private String location;
@SerializedName(value="temp", alternate="temperature")
private int temp;
@SerializedName(value="outlook", alternate="weather")
private String outlook;
现在我们已经添加了注释,让我们测试一下我们的例子:
@Test
public void test() throws Exception {
Gson gson = new GsonBuilder().create();
Weather weather = gson.fromJson("{\n"
+ " \"location\": \"广州\",\n"
+ " \"temp\": 15,\n"
+ " \"weather\": \"多云\"\n"
+ "}", Weather.class);
TestCase.assertEquals("广州", weather.getLocation());
TestCase.assertEquals("多云", weather.getOutlook());
TestCase.assertEquals(15, weather.getTemp());
weather = gson.fromJson("{\n"
+ " \"place\": \"深圳\",\n"
+ " \"temperature\": 35,\n"
+ " \"outlook\": \"晴天\"\n"
+ "}", Weather.class);
TestCase.assertEquals("深圳", weather.getLocation());
TestCase.assertEquals("晴天", weather.getOutlook());
TestCase.assertEquals(35, weather.getTemp());
}
结论
我们通过使用Jackson的@JsonAlias或Gson的替代参数看到了这一点,我们可以轻松地将不同的JSON格式转换为相同的Java对象。
java jsonalias_将多个JSON字段映射到单个Java字段相关推荐
- java postgresql json_java – 将PostgreSQL JSON列映射到Hibernate值类...
See PgJDBC bug #265. PostgreSQL对数据类型转换过于严格,非常严格.它不会隐式地将文本转换为类似文本的值,例如xml和json. 解决此问题的严格正确方法是编写使用JDBC ...
- Java中普通字符串转json,老司机帮您java中如何将字符串转成json
电脑现已成为我们工作.生活和娱乐必不可少的工具了,在使用电脑的过程中,可能会遇到java中如何将字符串转成json的问题,如果我们遇到了java中如何将字符串转成json的情况,该怎么处理怎么才能解决 ...
- java 编译文件 命令,CMD命令行编译运行单个java文件
java文件中不含包名 这种情况比较简单 public class NoPackage{ public static void main(String[] args){ System.out.prin ...
- JSON解析基础使用知识-Java
JSON解析基础使用知识 JSON格式 假设我们定义一本书 一本书有他的书名和内容,那么JSON数据如下 {"name":"诗经","info&quo ...
- javaweb中服务器响应,Java Web服务器响应与JSON
我想创建一个简单的Java Web应用程序响应GET请求/用JSON字符串测试.Java Web服务器响应与JSON 我的环境是Java,Intellij和Tomcat 8.5.4. 到目前为止,我有 ...
- java文件编译_【java】javac编译多个有依赖关系的java文件为class文件
历史文章: [javac命令不能使用,提示不是内部命令或外部命令,请查看历史文章] =================需求说明========================== 之前的文章中,仅说明 ...
- Mybatis实现存取Mysql的Json字段映射Java对象
Mybatis实现存取Mysql的Json字段映射Java对象 一.需求 二.解决方案 一.需求 在业务比较复杂的项目模块,为了应对多样化的场景,我们通常会在mysql中采用json格式来存储相应的信 ...
- oracle 代码 字段映射,将ORACLE TIMESTAMP(9)字段映射到java.util.Date
存在将ORACLE TIMESTAMP(9)字段映射到Java中的java.sql.Timestamp或java.util.Date的问题 ojdbc 11.2.0.1. 0 休眠的注解3.3.1.G ...
- java字段映射配置,mybati 字段映射
Java中属性命名一般使用驼峰命名法,mysql中的字段一般使用"_"来连接两个单词.例如mysql中一般都是 admin_id 而不是adminId,java程序中在dao层定义 ...
最新文章
- 返回浏览器或div 顶部
- 组策略之(5)-------电源管理设置
- kubernetes集群命令行工具kubectl
- 变态题大串烧:微软面试问题 -- 二.没有答案型
- 应用存储和持久化数据卷:核心知识
- 信息系统项目管理师优秀论文:沟通与干系人管理
- 人脸识别可以分辨同性恋?论科技研发和伦理道德之间的矛盾
- 简单几步即可判断Linux系统有无被DDOS攻击的方法
- docker初识_初识 docker 搭建自己的开发环境
- postforobject 设置代理_Spring RestTemplate和代理身份验证
- android升级异常,升级AndroidX遇到的问题
- linux安装oracle
- java多态机制优点_java面向对象多态性有什么好处?能说的简单易懂点,最好有代码实现结果信息,麻烦各位java大神回答一下?...
- 第 7 章 缓存应用程序块
- Quorum企业以太坊搭建区块链记录系列
- 极客时间_week03_work
- QQ邮箱的一些bug
- Google巧妙发布Sky星空地图
- 阿里云云服务器 修改远程桌面端口
- 【论文精读3】MVSNet系列论文详解-P-MVSNet
热门文章
- java工作台无法显示_【Eclipse】使用指南(18)搜索工作台
- html title属性无效_【学习教程】使用JavaScript删除CSS属性
- Redis免费客户端 Another Redis DeskTop Manager 下载地址及安装教程
- 华强北耳机为啥老是有人翻车?
- 面试必备:CAS无锁机制
- maven打包:找不到符号 符号: 方法 getXxx()
- idea中代码能够运行,但是显示类找不到
- ajax 高并发请求,理解node.js处理高并发请求原理
- Java模拟事务Demo
- pmtk3怎样离线安装