前言
在本文中,我们将详细介绍如何使用JSONTemplater和文本写模块来编写嵌套的JSON。
基本模式是读取数据(在这种情况下,JSON没有几何图形,但可以是FME中的任何数据),使用JSON模板程序创建包含具有嵌套结构的JSON的FME属性,然后将JSON属性写入文本文件。我们使用的是文本文件写模块而不是JSON写模块,因为在FME中,当您想直接写出属性的内容时,您都会使用文本文件写模块。
JSONTemplater使用一种模板方法来编写嵌套的JSON(非常类似于XML模板器)。模板表示数据的结构,其函数如fme:get-attribute函数、fme:get-json-attributes或fme:process-features在模板中用于从FME属性构建JSON结构。使用子模板可以创建一个具有多个子元素的根目录的文档。
步骤介绍
1.启动FME工作台并生成工作区
启动FME工作台,然后单击“生成工作区”。填写如下内容的“生成工作区”对话框应该是这样的:
2.在可视化预览中检查源数据
运行工作区并检查源数据集:
你可以看到这185个要素都是温哥华的一个艺术中心。虽然数据包括经度和纬度值,但我们将在本例中不会创建几何图形。其目标是将这个JSON从一个具有Neighborhood属性的大数组转换为键值对的嵌套结构,其中每个艺术中心信息都嵌套在其各自的Neighborhood下面,例如:
{
"Downtown": [{
"Name": "Harbour Centre Parkade",
"Title": "The Belonging Action",
"Longitude": -123.110097741722,
"Latitude": 49.2837806793832
},
{
"Name": "Chinese Cultural Centre",
"Title": "China Gate",
"Longitude": -123.103282272368,
"Latitude": 49.2797561341325
},
...
],
"Strathcona": [{
"Name": "National Works Yard",
"Title": "Roller",
"Longitude": -123.092675,
"Latitude": 49.2736209999959
},
{
"Name": "Jim Green Residence",
"Title": "Entranceway",
"Longitude": -123.095131,
"Latitude": 49.2842699999959
},
...
],
...
}
3. 添加一个Sampler转换器
为了构建嵌套的JSON,我们将使用一个带有两个子模板的JSONTemplater:一个用于为每个社区创建一个单独的数组,另一个用于包含该社区中的所有艺术中心。为了每个社区获得一个单独的数组,我们需要为JSONTemplater提供一个个功能,每个社区都只提取一个样本。为此,我们将使用一个Sampler。然后设置以下参数,您的对话框应该是这样的:
启用功能缓存后,单击转换器上的“运行到此”。您应该有六个要素来Sampler:输出端口,每个社区都有一个。这些将提供给JSONTemplater子模板之一。
4. 添加一个JSONTemplater
现在我们有了neighborhood要素,在Sampler之后添加一个JSONTemplater。
打开JSONTemplater。首先,让我们添加我们的子模板。子模板用于将FME属性转换为ROOT模板的子元素,甚至是其他子模板。
要添加子模板,请选中子模板框,然后单击子模板表中的+按钮。在端口字段中,添加一个NEIGHBORHOOD子模板,并添加另一个子模板并称之为ART。
您会注意到每个模板字段都是红色的,这意味着我们必须提供一个值才能单击确定。因为我们想将新的子模板端口连接到要素,所以首先需要在每个模板字段中输入空的卷括号{}。您的对话框应该是这样的:
5.将要素连接到JSON模板处理器输入端口
您将看到每个模板(ROOT、NEIGHBORHOOD和ART)都会创建一个输入端口。我们为屋顶提供6个功能,但目前没有为其他端口提供任何功能。由于我们希望ART包含所有的艺术安装,请单击并从阅读器功能类型拖动到ART端口。这将提供在我们的子模板中使用的所有185个要素。您的工作空间应该是如下:
现在我们需要将要素连接到根模板。因为我们希望从JSONTemplater输出单个JSON文档,所以最简单的事情是使用Creator转换器,它将为根模板提供单个要素。将创建者添加到空白画布中,并将其连接到JSONTemplater的根输入端口:
6.构建根模板
现在我们已经连接到两个模板,再次打开JSONTemplater的参数。
首先,让我们设置ROOT模板。此模板设置了JSON层次结构的顶层,在这种情况下,将只执行一次,因为它接收到一个要素。单击“根模板”字段旁边的[…]图标,以打开“根模板表达式”对话框。此对话框类似于文本编辑器,并允许我们构建模板表达式。复制和粘贴以下模板,或通过键入并双击左侧的子模板>SUB来添加函数(注意卷括号{||}内的管道):
{|
fme:process-features("NEIGHBORHOOD")
|}
fme::process-features(“NEIGHBORHOOD”)函数,将把我们的子模板NEIGHBORHOOD的结果作为项插入到数组中。
对于这个示例,我们使用了一个稍微高级一点的JSON模板表达式,管道符号|。如JSONiq文档中指定的,管道符号是一个动态对象构造表达式。在这种情况下的含义是:将子模板的每个结果创建为单独的对象。如果我们不添加这些管道,生成的JSON文档将不会在每个社区条目之间有所需的逗号。
7.构建NEIGHBORHOOD模板
此子模板将为每个要素创建JSON文档,用neighborhood的名称代替fme:get-attribute("Neighborhood")。fme:process-features(“ART”)函数将把我们的子模板ART的结果作为项目插入到数组中。单击[…]NEIGHBORHOOD的模板字段旁边的图标。请输入以下模板:
{
fme:get-attribute("Neighborhood") : [
fme:process-features("ART", "Neighborhood", fme:get-attribute("Neighborhood"))
]
}
8.构建ART模板
Next,let’s build the ART sub-template. Click on the [...] icon next to the Templatefield for ART. Enter the following template:
接下来,让我们构建ART子模板。单击[…]ART模板字段旁边的图标。请输入以下模板:
{
"Name" : fme:get-attribute("Name"),
"Title" : fme:get-attribute("Title"),
"Latitude" : fme:get-attribute("Latitude"),
"Longitude" : fme:get-attribute("Longitude")
}
该模板将构建数据数组,每个FME要素都被转换为一个匹配此模式匹配的JSON。单击“确定”。
9.查看迄今为止的结果
运行工作空间并检查JSON模板处理器的输出端口。您应该看到所有的社区组合成一个与属性_result中的目标模板相匹配的JSON文档。单击“视觉预览表视图”中单元格旁边的[…]按钮可以查看完整的值。然而,这个JSON很难阅读,因为它不是很漂亮的展示:
10.添加JSONFormatter
在JSONTemplater之后添加一个JSONFormast。这个转换器将格式化我们的JSON文档,所以它是漂亮的打印。打开其参数,并将JSON文档设置为_result。然后,将输出属性设置为text_line_data。此属性名称被保留,供使用文本文件写模块编写时使用。您的对话框应该是这样的:
11.运行工作区并检查最终结果
在可视化预览或您选择的文本编辑器中运行您的工作区并检查最终结果。您应该看到JSON遵循文章开头确定的目标结构,类似于这样(缩写):
{
"Downtown": [{
"Name": "Harbour Centre Parkade",
"Title": "The Belonging Action",
"Longitude": -123.110097741722,
"Latitude": 49.2837806793832
},
{
"Name": "Chinese Cultural Centre",
"Title": "China Gate",
"Longitude": -123.103282272368,
"Latitude": 49.2797561341325
},
...
],
"Strathcona": [{
"Name": "National Works Yard",
"Title": "Roller",
"Longitude": -123.092675,
"Latitude": 49.2736209999959
},
{
"Name": "Jim Green Residence",
"Title": "Entranceway",
"Longitude": -123.095131,
"Latitude": 49.2842699999959
},
...
],
...
}
恭喜你!您学习了如何使用JSON模板化器从FME要素创建自定义嵌套JSON。将子模板与模板表达式对话框中可用的函数相结合,可以获得复杂的自定义JSON结果。