span8
span4
在前一篇文章中,编写JSON,我们研究了使用FME编写JSON的不同方法。在本文中,我们将详细介绍如何使用JSONTemplater和Text File写入器编写嵌套JSON。这个工作流亚搏在线将允许我们编写上一篇文章最后一步中提到的嵌套数据。
这个用例稍微高级一些,但是如果您想要编写嵌套的JSON数据,这个用例是必要的。基本模式是读入数据(在本例中,JSON没有几何形状,但它可以是FME中的任何数据),使用JSONTemplater创建包含嵌套结构的JSON的FME属性,然后将JSON属性写入文本文件。我们使用文本文件写入器而不是JSON写入器,因为在FME中,任何时候你想直接写出属性的内容,你都可以使用文本文件写入器。
JSONTemplater使用模板方法来编写嵌套JSON(非常类似于XMLTemplater).模板表示数据的结构,使用fme:get-attribute函数、fme:get-json-attributes或fme:process-features等函数在模板中使用,以fme特性构建JSON结构。使用子模板可以创建一个具有多个子元素的根的文档。
输入JSON:PublicArt.json
1.启动FME工作台并生成工作区
启动FME工作台并单击Generate Workspace。按照如下方式填写生成工作区对话框:
读者
格式:JSON (JavaScript对象符号)
数据集:PublicArt。json(download and use local path)
作家
格式:文本文件
数据集:……\ \ PublicArtNested输出。Json(只要你愿意)
你的对话框应该是这样的:
单击OK。
2.在可视化预览中检查源数据
运行工作区并检查源数据集:
你可以看到这185个特色中的每一个都是温哥华的一个艺术装置。尽管数据包括经度和纬度值,但在本例中我们不会创建几何图形。我们的目标是将这个JSON从一个带有Neighborhood属性的大数组转换为一个键值对嵌套结构,其中每个艺术装置都嵌套在其各自的Neighborhood下面,如下所示:
{"市区":[{"名称":"海港中心公园","标题":"归属行动","经度":-123.110097741722,"纬度":49.2837806793832},{"名称":"中国文化中心","经度":-123.103282272368,"纬度":49.2797561341325},…[{"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.添加一个取样器
为了构建我们的嵌套JSON,我们将使用带有两个子模板的JSONTemplater:一个用于为每个社区创建单独的数组,另一个用于包含该社区中的所有艺术安装。为了为每个邻居获得一个单独的数组,我们需要为JSONTemplater提供六个特性,每个邻居一个。为此,我们将使用一个采样器变压器。添加一个采样器并将其连接到阅读器特征类型,然后设置以下参数:
组:社区
采样类型:前N个特征
你的对话框应该是这样的:
单击OK。
启用了特性缓存后,在采样器上单击“运行到此”。你应该有六个特征来自采样器:采样端口,每个社区一个。这些将提供给JSONTemplater子模板之一。
4.添加一个JSONTemplater
现在我们有了邻居特性,在Sampler之后添加一个JSONTemplater。
打开JSONTemplater。首先,让我们添加子模板。子模板用于将FME特性转换为ROOT模板的子模板,甚至是其他子模板。
若要添加子模板,请选中子模板框,然后单击子模板表中的+按钮。在Port字段中,将这个子模板称为NEIGHBORHOOD。添加另一个子模板并将其命名为ART。
您会注意到每个Template字段都是红色的,这意味着我们必须在单击OK之前提供一个值。因为我们想要将新的子模板端口连接到特性,所以首先只需在每个Template字段中输入空花括号{}。你的对话框应该是这样的:
单击OK。
5.将特性连接到JSONTemplater输入端口
您将看到每个模板(ROOT、NEIGHBORHOOD和ART)创建一个输入端口。我们向ROOT提供了6个特性,但目前没有向其他端口提供任何特性。因为我们希望ART包含所有的艺术装置,所以单击并从阅读器特征类型拖动到ART端口。这将提供子模板中使用的所有185个特性。你的工作空间应该是这样的:
现在我们需要将特性连接到Root模板。因为我们希望从JSONTemplater输出单个JSON文档,所以最简单的方法是使用Creator,它将为Root模板提供单个特性。向空白画布添加一个Creator,并将其连接到JSONTemplater的Root输入端口:
6.构建ROOT模板
现在我们已经有了连接到两个模板的特性,再次打开JSONTemplater的参数。
首先,让我们设置ROOT模板。该模板设置JSON层次结构的顶层,在这种情况下,只执行一次,因为它接收一个特性。点击[…图标旁边的ROOT Template字段,以打开ROOT Template Expression对话框。这个对话框类似于文本编辑器,让我们构建模板表达式。复制粘贴下面的模板,或者通过键入并双击左侧的Sub Templates > Sub来添加函数(注意花括号内的管道,{| |}):
{| fme:工艺特点(“邻居”)|}
函数fme:process-features(" NEIGHBORHOOD ")会将子模板NEIGHBORHOOD的结果作为项插入数组中。
对于本例,我们使用了一个稍微高级一点的JSON模板表达式,管道|。在JSONiq文档,管道是一个动态对象构造表达式。在这种情况下,它的意思是:将子模板的每个结果创建为一个单独的对象。如果我们不添加这些管道,得到的JSON文档就不会在每个邻居条目之间有必要的逗号。
单击OK。
7.构建NEIGHBORHOOD模板
这个子模板将为每个特性创建JSON文档,并将邻域的名称替换为fme:get-attribute(“neighborhood”)。fme:process-features(" ART ")函数将子模板ART的结果作为项插入数组。点击[…图标旁边的模板字段的邻居。输入如下模板:
{fme:get-attribute("Neighborhood"): [fme:process-features("ART", "Neighborhood", fme:get-attribute("Neighborhood"))]}
单击OK。
8.构建ART模板
接下来,让我们构建ART子模板。点击[…图标旁边的模板字段为ART。输入如下模板:
{"Name": fme:get-attribute("Name"), "Title": fme:get-attribute("Title"), "Latitude": fme:get-attribute("Latitude"), "Longitude": fme:get-attribute("Longitude")}
该模板将构建美术安装数据数组,将每个FME功能转换为匹配此模式的JSON。单击OK。
9.查看到目前为止的结果
运行工作区并检查JSONTemplater的Output端口。您应该看到所有的邻居组合成一个JSON文档,在属性_result中匹配我们的目标模板。单击[…按钮,在“可视化预览”的“表格视图”中的单元格旁边查看全部值。然而,这个JSON是相当难读的,因为它不是漂亮打印:
让我们来解决这个问题。
10.添加一个JSONFormatter
在jsontemplate之后添加一个JSONFormatter。这个转换器将格式化我们的JSON文档,使其打印得很漂亮。打开它的参数并将JSON文档设置为_result。然后,设置输出属性为text_line_data。此属性名保留以供使用文本文件写入器写入时使用。你的对话框应该是这样的:
单击OK。
11.运行工作区并检查最终结果
运行您的工作区并在可视化预览或选择的文本编辑器中检查最终结果。您应该看到JSON遵循本文开头确定的目标结构,类似于以下内容(缩写):
{"市区":[{"名称":"海港中心公园","标题":"归属行动","经度":-123.110097741722,"纬度":49.2837806793832},{"名称":"中国文化中心","经度":-123.103282272368,"纬度":49.2797561341325},…[{"Name": "National Works Yard", "Title": "Roller", "Longitude": -123.092675, "Latitude": 49.2736209999959}, {"Name": "Jim Green Residence", "Title": "Entranceway", "Longitude": -123.095131, "Latitude": 49.2842699999959},…),…}
恭喜你!您了解了如何使用JSONTemplater从FME特性创建自定义嵌套JSON。将子模板与Template Expression对话框中可用的函数相结合,可以得到复杂的自定义JSON结果。
数据属性
这里使用的数据来源于由温哥华的城市不列颠哥伦比亚省。它包含了在温哥华开放政府许可证下许可的信息。
额外的资源
最多可使用10个附件(包括图片),每个附件不得超过4.0 MB,总附件不得超过4.0 MB。
@petrahammoser我有相关问题"JSONTemplater sub-template配置"
“类型”:“LineString”,
"coordinates":[]我们如何将LineString解析为"coordinates" ?你能帮帮我吗?
@samat亚搏在线safe,@deanat亚搏在线safe这是一篇非常有见地的文章,我正在工作的一个项目,我渲染JSON数据嵌入到一个MapBox GL HTML模板(不是传单)。然而,我看到的一个关键问题是,在根模板上添加管道会触发一个错误消息,但如果没有管道,我就得不到逗号。不知道如何解决这个问题。
此外,我的模板生成多边形,但坐标输出是用引号包装的……我怎么去掉引号?
嗨@jnotter,很高兴听到你觉得这篇文章有用。对你的问题的一些想法:
祝你好运,请让我们知道进展如何。
©2020 S亚搏在线afe Software Inc |法律