---
title: "Web服务数据集成"
date: "2020-05-11"
categories: 
  - "data-integration"
  - "json"
  - "tools"
tags: 
  - "data-integration"
  - "data-mapping"
  - "excel-data-mapping"
  - "json-mapping"
  - "mapforce"
  - "web-services"
description: 探索如何使用 MapForce，将来自网络服务的天气预报数据集成到 Excel 中，重点关注 JSON 映射和数据转换技术。
---
Status: #blog

Tags:  #data-integration #data-mapping #excel-data-mapping #json-mapping #mapforce #web-services

Categories: [data-integration](/blog/zh/category/data-integration.md) | [json](/blog/zh/category/json.md) | [tools](/blog/zh/category/tools.md)
# Web服务数据集成

在[之前的文章](https://www.altova.com/blog/analyze-json-data-in-xmlspy-grid-view/)中，我们提到，任何数据集成和报表任务都需要从对源数据的清晰理解开始。我们使用 XMLSpy，这是一款领先的[XML 和 JSON 编辑器](https://www.altova.com/zh/xmlspy-xml-editor)，并利用其网格视图功能，分析了从 Web 服务获取的 5 天天气预报的 JSON 数据。

延续我们之前的示例，我们将使用MapForce，这是一款屡获殊荣的图形化工具 [用于任意数据类型之间转换和集成的映射工具](https://www.altova.com/zh/mapforce), 我们将把一系列主要集装箱港口的预测数据整理成格式美观的Excel文档。我们会特别强调任何可能导致延误的预测，例如强风或强降雨，这些天气条件可能会干扰起重机的装卸作业，或者减缓船舶进出港口的效率。

![](/blog/images/containership.jpg)

<!--more-->

REST接口用于获取天气预报，它接受经纬度坐标作为输入，并返回全球任何地点的未来5天的天气预报。一个MapForce映射可以同时处理多个输入和输出，因此，我们将从构建一个包含港口及其坐标的列表开始，以此启动Web服务数据集成项目。

在 XMLSpy 中，只需在网格视图中创建一个新的 JSON 文档，然后直接输入数据，无需担心 JSON 语法字符，即可快速生成列表。在下面的图片中，我们点击了左上角的图标，以表格形式显示列表：

[![在 XMLSpy 中，以 JSON 网格视图展示主要货运港口列表](/blog/images/port-list-grid.png)](port-list-grid.png)

网格视图（Grid View）相比于文本视图（Text View），在查看和审查文件内容时更加方便，因为文本视图会显示JSON文件中所有必要的语法字符。

[![同样的 JSON 文件，以文本视图显示](/blog/images/port-list-text.png)](port-list-text.png)

### 数据映射概述

MapForce Web服务的数据集成项目将以港口列表作为输入文件，针对每组坐标发出REST请求，并将每个港口对应的JSON数据映射到Excel工作表中。

MapForce 使用 JSON 模式文件，遵循 [json-schema.org](http://json-schema.org) 的规范，来对 JSON 数据结构进行建模，以便进行映射。MapForce 还可以自动从一个 JSON 实例生成 JSON 模式文件。这对于单个的 "port-list.json" 文件来说是完全可以的。

我们还需要一个 JSON 模式来映射 Web 服务返回的数据，这稍微复杂一些。我们没有一个单独的 .json 预测文件，其中包含了响应中所有可能的、既是必需的又是可选的数据变体。

幸运的是，XMLSpy 可以根据 XMLSpy 项目文件夹中收集的多个实例文档，生成 JSON 模式。

[![在 XMLSpy 中，根据多个实例文件生成 JSON 模式](/blog/images/xmlspy-schema-gen.png)](xmlspy-schema-gen.png)

打开生成的模式，在 JSON Schema 视图中，我们看到 "rain" 对象是可选的。这是因为至少有一个天气预报实例文件中，在整个 5 天内都没有预测到降雨，因此响应中没有包含任何 "rain" 对象。

[![在 XMLSpy 的“模式”视图中查看模式](/blog/images/schema-view.png)](schema-view.png)

我们可以使用这个模式来描述映射中的REST响应数据。

在下面的图片中，我们已经开始构建数据映射，首先导入了“post-list.json”文件和一个新的Web服务。我们添加了REST接口的URL，并将经纬度坐标作为输入参数，用于构建请求。目前，响应的内容还没有明确的结构。

[![将REST接口的响应结果添加到Web服务数据集成映射中](/blog/images/port-mapping-1.png)](port-mapping-1.png)

我们可以点击主体区域来打开“响应结构”对话框，并在其中指定我们在 XMLSpy 中生成的模式

[![添加 JSON 模式，用于映射 REST 接口返回的数据结构](/blog/images/response-structure-dialog.png)](response-structure-dialog.png)

一旦定义了模式，主体中的所有项目都可用于映射

[![在Web服务数据集成映射中，查看每个REST响应项](/blog/images/port-mapping-2.png)](port-mapping-2.png)

现在，我们可以添加目标 Excel 文件。我们提供了一个示例电子表格，您可以将其作为模板使用，其中包含一些单元格样式、图表以及一些示例数据：

[![一个用于最终输出结果的电子表格模型](/blog/images/sheet-1.png)](sheet-1.png)

我们可以将此电子表格添加到Web服务数据集成映射中，作为目标，但我们仍然需要确定哪些单元格将接收数据

[![将电子表格添加到数据映射中](/blog/images/port-mapping-3.png)](port-mapping-3.png)

点击“Rows 1, n=dyn”右侧的按钮，会打开“选择范围”对话框。第10行包含数据的列标题，因此我们希望将主表从第11行开始，映射到A列到K列。这些列包含不同类型的数据，这些数据类型主要对应于JSON源中的文本或数值类型，以及Excel中的格式类型。通过“选择范围”对话框，我们可以精确地定义目标范围和数据类型：

[![选择一个单元格区域，用于接收数据](/blog/images/select-range-dialog.png)](select-range-dialog.png)

在“选择范围”对话框中，识别并输入列名，这些列名将被添加到输出映射中作为标签。接下来，我们可以构建逻辑，将每个预测结果映射到一个单独的Excel文件中，具体方法如下：

[![为每个电子表格创建独特的名称](/blog/images/port-mapping-4.png)](port-mapping-4.png)

Excel目标文件名的最上方设置的是<dynamic>，这表明映射过程会生成文件名。每个实际的文件名都是通过一个连接函数构建的，该函数会从源数据列表中提取城市名称，从而生成类似“forecast-Seattle.xlsx”等文件名。

我们还需要确保每个文件中主要数据表从第11行开始。为此，我们将列表数组的顶层对象与目标（第10行，n=dyn）关联起来，并使用一个自动编号功能，以便每次文件名更改时都能重置起始行。

响应中的每个列表对象都会对应到 Excel 表格中的一个新行。现在，我们可以将响应中的各个条目与该行中的各个列关联起来。在下面的图片中，我们已经将所有不需要进一步转换的条目与相应的列进行了关联。

[![将 REST 响应中的数据项与电子表格中的单元格关联起来](/blog/images/port-mapping-5.png)](port-mapping-5.png)

对于直接关联的字段，JSON响应中的数据类型与我们在电子表格中为这些列指定的数据类型完全对应。例如，源JSON数据中的“Temp”字段是数值类型，而目标电子表格中E列也是数值类型。同样，源JSON数据中的“description”字段是字符串类型，而目标电子表格中B列也是字符串类型，以此类推。

在响应的 JSON 模式中，我们看到“rain”（降雨）对象是可选的。如果该对象不存在，我们希望将其替换为零。这可以通过构建一个表达式来实现，该表达式结合了“存在性”判断和“如果-否则”逻辑：

[![如果缺少降雨量数据，则输入0。](/blog/images/port-mapping-6.png)](port-mapping-6.png)

JSON 数据格式的一个局限性在于，它只包含两种数据类型：字符串和数值。JSON 中没有定义像整数、日期时间等数据类型，也没有定义 Excel 中的特殊格式，例如百分比和会计格式。MapForce 提供了便捷的内置函数，可以将源数据转换为映射中所需的各种目标数据类型。 这样，我们就可以在 Excel 表格的 A 列中创建我们想要的日期时间格式。

JSON数据中的“main.dt_text”字段表示日期和时间，以字符串形式存储，例如：2020-05-09 06:00:00。MapForce提供了一个名为“parse-dateTime”的函数，该函数接收一个字符串和一个格式模型作为输入，并返回一个日期时间结果。但还有一个问题：dt-txt字符串所使用的时区是格林威治标准时间（GMT），而不是预报城市当地时间。当地时区偏移量以正数或负数秒表示，存储在“city.timezone”字段中。

为了保持主映射视图的简洁，我们创建了一个名为 `calc-local-time` 的用户函数。这个函数接收一个字符串和一个偏移量，并计算出本地时间。用户函数的使用方式与内置函数相同：

[![](/blog/images/port-mapping-7-2.png)](port-mapping-7-2.png)

为了完成Web服务数据集成映射的最后一步，我们需要将城市名称和国家名称合并，并将它们添加到第一行、C列

[![在第一行添加城市和国家信息](/blog/images/port-mapping-8.png)](port-mapping-8.png)

以下是最终映射的完整视图：

[![对Web服务数据集成映射的全面概述](/blog/images/port-mapping-complete.png)](port-mapping-complete.png)

为了获得每个城市所需的、格式正确的Excel文档，我们需要一个与每个目标文件名相对应的、已经格式化的Excel文件作为模板。批处理文件是一种快速的方法，可以通过重复复制原始的Excel样本文件，并保留其样式和公式，来创建这些文件。

### Web服务数据集成结果

点击映射窗口左下角的“输出”按钮，即可执行映射并将结果生成输出文件。如果工作站上安装了Excel，则可以在“输出”窗口中预览实际的Excel输出结果

[![输出预览窗口，显示生成的第一个Excel文件](/blog/images/port-forecast-output-1.png)](port-forecast-output-1.png)

在页面的顶部，日期、时间和当前天气信息，以及降雨图旁边的文本摘要，都是通过 Excel 表格中的公式生成的。所有九个输出文件都已经生成，我们可以选择并预览任何一个文件。以下是下拉式文件选择列表，以及包含西雅图天气预报的第七个文件：

[![菜单：用于预览另一个输出文件](/blog/images/port-forecast-output-2.png)](port-forecast-output-2.png)

Excel 的功能可以在预览窗口中使用。例如，这个电子表格使用了分屏滚动功能，并且固定显示了顶部区域。我们可以滚动到主数据表格的底部，以查看预测中最后一次降雨量的数据。请注意左侧的行号：

[![在预览窗口中滚动查看输出数据](/blog/images/port-forecast-output-3.png)](port-forecast-output-3.png)

如果输出结果令人满意，我们可以选择保存一个或所有生成的文件：

[![保存 Web 服务数据集成输出文件](/blog/images/port-forecast-output-4.png)](port-forecast-output-4.png)

### 中间数据

MapForce 的设计目标是提高数据转换的效率。我们从未需要保存、管理或显式地操作来自 REST 响应的中间 JSON 数据。执行此 Web 服务数据集成映射时，不会保存中间数据。

如果我们需要保存 JSON 响应数据以及最终的 Excel 电子表格，MapForce 提供了多种选择。一种方法是创建链式映射，将响应数据保存为中间 JSON 文件，该文件基于与响应相同的模式。然后，我们可以将该 JSON 文件映射为 Excel 输出。链式映射允许您预览和保存中间文件以及最终结果。下图显示了由链式映射生成的输出文件列表，其中一个 JSON 文件在后台以文本视图显示：

[![一种用于Web服务数据集成的方法，该方法使用中间数据进行映射](/blog/images/port-forecast-output-5.png)](port-forecast-output-5.png)

### 自动化Web服务数据集成

我们的工作流程需要每天更新预测数据。我们可以将映射关系保存为 MapForce Server 的执行文件，以便 MapForce Server 进行[自动化处理](https://www.altova.com/zh/mapforce-server)，或者直接将其部署到 FlowForce Server，以按照预定的时间表自动生成新的预测数据。一个 FlowForce Server 任务可以将数据集成任务与多种操作结合起来，包括系统操作，如移动文件或发送电子邮件。此外，一个 FlowForce Server 任务还可以[执行复杂的流程](https://www.altova.com/zh/flowforceserver)，这些流程可以将结果和参数传递给其他任务，从而触发其他任务的执行。

观看一份简短的[视频演示](https://www.altova.com/zh/mapforce/demos)，了解 MapForce 的功能，或者[下载免费试用版](https://www.altova.com/zh/mapforce/download)，其中包含教程、帮助文档以及更多示例，帮助您快速开始使用 MapForce，用于 JSON 和 Web 服务数据的集成，或者其他数据映射、转换和处理需求！
