使用Jackson轻松将JSON映射到Java对象

Easy Mapping JSON to Java Objects Using Jackson

介绍

Jackson是一个非常流行且高效的基于Java的库,用于将JSON映射到Java对象,反之亦然。 在本文中,我将演示使用Jackson检索从REST API接收的JSON响应中的数据并将其保存到CSV文件的过程是多么容易。

我将从Elektron数据平台(EDP)检索财务数据,该平台可访问Refinitiv的各种数据集,并将使用历史价格作为样本。

您可能还会喜欢:用Jackson处理JSON

Image title

先决条件

1. EDP访问凭证(用户名,密码和clientId),可以检索历史定价事件数据。 您可以联系Refinitiv代表以获取用户名和密码,并在App密钥生成器中使用该用户名和密码生成clientId。

2. EDPToken帮助器类用于获取访问令牌,该访问令牌在任何数据请求之前都是必需的。 您只需遵循以下文章即可:从Java的EDP Gateway轻松获得令牌。

怎么运行的

该过程的概述如下图:

Image title

首先,您需要具有一个Java类(图中的顶部灰色框),该类与EDP的JSON数据响应的格式匹配。 下面的创建与EDP的JSON响应匹配的Java类"中介绍了创建Java类的步骤。

然后,您可以使用Jackson ObjectMapper读取从REST API接收到的Java类和JSON响应,以创建表示已解析的JSON的Java对象。 然后,您可以调用Java对象的方法来获取已解析的JSON的任何值。

在我的应用程序中,我将通过调用HistoricalPricingEvent对象的方法来获取数据键,名称和键入标头键的值。 剪切的源代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Jackson ObjectMapper reads HistoricalPricingEvents class and historical pricing events JSON response
//to create an object representing the parsed JSON.
HistoricalPricingEvent eventsData = new ObjectMapper().readerFor( HistoricalPricingEvent.class).readValue(jsonResp);
//get the values of data key in the object
List<List<String>> data = (List<List<String>>)eventsData.getData();
//Get the values of headers key in the object
List<Header> headers= eventsData.getHeaders();
//Get the values of name and type key in headers
Iterator<Header> hiterator = headers.iterator();
while(hiterator.hasNext()) {
   Header aheader = (Header)hiterator.next();
   String name = aheader.getName();
   String type = aheader.getType();
}

HistoricalPricingEvent类可以由http://www.jsonschema2pojo.org/生成。

完整的应用程序源代码,包括HistoricalPricingEvent类,可以在GitHub上找到。

创建一个Java类以匹配来自EPD的JSON响应

我将使用http://www.jsonschema2pojo.org/页面,而不是手动编写完整的Java类,该页面可以从JSON和JSON模式生成带有Jackson批注的Java类。 请按照以下步骤从历史定价事件数据JSON响应的JSON模式创建Java类。

1.转到API Playground并找到/ data / historical-pricing /服务。 然后,选择/ views / events / {universe}路径。

Image title

2.选择 Swagger 菜单以下载JSON模式文件。

Image title

3.打开架构文件。 在/ views / events / {universe} 下,找到包含数据的成功响应(200 HTTP状态代码)。 响应引用/ definitions / historicalPricingData路径中的值。

Image title

将值复制到/ definitions / historicalPricingData路径中:

将值粘贴到http://www.jsonschema2pojo.org/上的文本框中

4.在文本框中查找值,找到$ref,它引用/ definitions / statuspath:

将值复制到$ref所指的/ definitions / statuspath中:

$ref line替换为复制的值:

文本框中(步骤3-4)的完整JSON模式是dataResponseJson.zip。

5.设置 Package Class name ,例如 com.java.response和HistoricalPricingEvent。 在源类型,选择 JSON模式。 类名称是与JSON模式格式匹配的Java类的名称。

6.点击 Zip 按钮。 然后,生成Java类并将其压缩在zip文件中。 最后,显示zip文件名:

单击文件名进行下载。

解压缩zip文件时,将看到Java类文件(HistoricalPricingEvent)和相关类,如下所示:

编译并运行应用程序

在编译和运行应用程序之前,您必须将CLASSPATH设置为指向Apache Http组件,Java中的JSON,Jackson Core,Jackson Annotations和Jackson Databind,例如以下Windows计算机上的示例:

1
set CLASSPATH=C:\thirdPartyJars\httpcomponents-client-4.5.9\lib\commons-codec-1.11.jar;C:\thirdPartyJars\httpcomponents-client-4.5.9\lib\commons-logging-1.2.jar;C:\thirdPartyJars\httpcomponents-client-4.5.9\lib\httpclient-4.5.9.jar;C:\thirdPartyJars\httpcomponents-client-4.5.9\lib\httpcore-4.4.11.jar;C:\thirdPartyJars\JsonInJava\json-20180813.jar;C:\thirdPartyJars\commons-cli-1.4\commons-cli-1.4.jar;C:\thirdPartyJars\Jackson\jackson-annotations-2.9.9.jar;C:\thirdPartyJars\Jackson\jackson-core-2.9.9.jar;C:\thirdPartyJars\Jackson\jackson-databind-2.9.9.jar

下面的Java命令行请求项名称" THB ="(即泰铢)的最新五个报价事件如下:

1
java -CLASSPATH %CLASSPATH%;. com.java.HistoricalPricingEventsRequestor -user <EDP username> -clientId <clientId> -rics THB= -events quote -count 5

成功后,控制台将显示以下内容:

您现在可以检查CSV文件中的历史价格事件数据,如下例所示:

摘要

这只是一个示例,用于说明如何使用Jackson将JSON映射到Java对象。 然后,您可以通过各种方式轻松管理Java对象。 它还建议使用http://www.jsonschema2pojo.org/,它可以根据JSON响应架构生成Java类。 Jackson要求使用该Java类将JSON响应解析为该Java类的对象。 尤其是使用架构文件访问和更新,这可以更加自动化,可以在APIDocs中找到其他API。

进一步阅读

用Jackson处理JSON

JSON的Jackson注释:反序列化