简介

本文中,教大家如何使用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字段相关推荐

  1. java postgresql json_java – 将PostgreSQL JSON列映射到Hibernate值类...

    See PgJDBC bug #265. PostgreSQL对数据类型转换过于严格,非常严格.它不会隐式地将文本转换为类似文本的值,例如xml和json. 解决此问题的严格正确方法是编写使用JDBC ...

  2. Java中普通字符串转json,老司机帮您java中如何将字符串转成json

    电脑现已成为我们工作.生活和娱乐必不可少的工具了,在使用电脑的过程中,可能会遇到java中如何将字符串转成json的问题,如果我们遇到了java中如何将字符串转成json的情况,该怎么处理怎么才能解决 ...

  3. java 编译文件 命令,CMD命令行编译运行单个java文件

    java文件中不含包名 这种情况比较简单 public class NoPackage{ public static void main(String[] args){ System.out.prin ...

  4. JSON解析基础使用知识-Java

    JSON解析基础使用知识 JSON格式 假设我们定义一本书 一本书有他的书名和内容,那么JSON数据如下 {"name":"诗经","info&quo ...

  5. javaweb中服务器响应,Java Web服务器响应与JSON

    我想创建一个简单的Java Web应用程序响应GET请求/用JSON字符串测试.Java Web服务器响应与JSON 我的环境是Java,Intellij和Tomcat 8.5.4. 到目前为止,我有 ...

  6. java文件编译_【java】javac编译多个有依赖关系的java文件为class文件

    历史文章: [javac命令不能使用,提示不是内部命令或外部命令,请查看历史文章] =================需求说明========================== 之前的文章中,仅说明 ...

  7. Mybatis实现存取Mysql的Json字段映射Java对象

    Mybatis实现存取Mysql的Json字段映射Java对象 一.需求 二.解决方案 一.需求 在业务比较复杂的项目模块,为了应对多样化的场景,我们通常会在mysql中采用json格式来存储相应的信 ...

  8. 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 ...

  9. java字段映射配置,mybati 字段映射

    Java中属性命名一般使用驼峰命名法,mysql中的字段一般使用"_"来连接两个单词.例如mysql中一般都是 admin_id 而不是adminId,java程序中在dao层定义 ...

最新文章

  1. 返回浏览器或div 顶部
  2. 组策略之(5)-------电源管理设置
  3. kubernetes集群命令行工具kubectl
  4. 变态题大串烧:微软面试问题 -- 二.没有答案型
  5. 应用存储和持久化数据卷:核心知识
  6. 信息系统项目管理师优秀论文:沟通与干系人管理
  7. 人脸识别可以分辨同性恋?论科技研发和伦理道德之间的矛盾
  8. 简单几步即可判断Linux系统有无被DDOS攻击的方法
  9. docker初识_初识 docker 搭建自己的开发环境
  10. postforobject 设置代理_Spring RestTemplate和代理身份验证
  11. android升级异常,升级AndroidX遇到的问题
  12. linux安装oracle
  13. java多态机制优点_java面向对象多态性有什么好处?能说的简单易懂点,最好有代码实现结果信息,麻烦各位java大神回答一下?...
  14. 第 7 章 缓存应用程序块
  15. Quorum企业以太坊搭建区块链记录系列
  16. 极客时间_week03_work
  17. QQ邮箱的一些bug
  18. Google巧妙发布Sky星空地图
  19. 阿里云云服务器 修改远程桌面端口
  20. 【论文精读3】MVSNet系列论文详解-P-MVSNet

热门文章

  1. java工作台无法显示_【Eclipse】使用指南(18)搜索工作台
  2. html title属性无效_【学习教程】使用JavaScript删除CSS属性
  3. Redis免费客户端 Another Redis DeskTop Manager 下载地址及安装教程
  4. 华强北耳机为啥老是有人翻车?
  5. 面试必备:CAS无锁机制
  6. maven打包:找不到符号 符号: 方法 getXxx()
  7. idea中代码能够运行,但是显示类找不到
  8. ajax 高并发请求,理解node.js处理高并发请求原理
  9. Java模拟事务Demo
  10. pmtk3怎样离线安装