jsonDOMGet

Version 24.3.9111


jsonDOMGet


从 JSON 文档中获取值。

必需的参数

  • map:*: 一组一个或多个输入,其中映射参数的名称以冒号开头(例如,map:foo),并且值是文档中所需 json 元素的 jsonpath(请参阅示例 了解详情)。

可选的参数

  • uri: JSON 文件的 URI。这可以是动态文件引用,例如输入文件的 [FilePath]、磁盘上的静态文件路径或 JSON 文件的公共 URL。
  • text:对 JSON 数据的可读句柄引用。 此句柄由 jsonOpen 操作创建,当输入 JSON 不是文件或原始文本,或者需要执行访问文档的文件数据的多个操作时,此句柄非常有用。
  • handle: 对 JSON 数据的可读句柄引用。 该句柄由 jsonOpen 运算器创建,仅当目标 JSON 不是输入文件时才需要。 有关详细信息和示例,请参阅 jsonOpen
  • repeatelement#: 文档中重复出现的元素的 jsonpath。
  • repeatmode: 定义 repeatelement# 值在输出项上的存储方式。 允许的值为 ITEMARRAY 。 当设置为 ITEM(默认值)时,从重复元素找到的值将作为单独的属性存储在运算器生成的每个输出项上。 当设置为 ARRAY 时,从重复元素找到的值将作为数组属性存储在单个输出项上,并且需要通过其基于 1 的索引进行访问(例如,[result.color#2]将引用 到结果项的 color 属性中的第二个值)。

输出属性

  • *: 使用 map 参数映射的 JSON 元素的输出值。 通过引用输出项和映射输入项的名称(例如 [results.foo])来访问它们。 输出项的名称(在本例中为 results)由用户确定。 有关其他上下文,请参阅示例

示例

从 JSON 文档中检索值

考虑以下的 JSON 数据,它作为输入数据传递给知行之桥的 Script 端口

{
    "name": "Owen",
    "age": "28",
    "gender": "Male"
}

在 Script 端口中,可以在 ArcScript 中调用 jsonDOMGet 来检索此数据中定义的人员的nameage,并将它们作为标题添加到 知行之桥 中的消息中。 下面的 ArcScript 代码显示了如何执行此操作的示例:

<!-- 设置输入uri和map参数-->
<arc:set attr="json.uri" value="[FilePath]" />
<arc:set attr="json.map:name" value="/json/name" />
<arc:set attr="json.map:age" value="/json/age" />

<!-- 调用运算器,传入 json 项并创建 “result” 输出项 -->
<arc:call op="jsonDOMGet" in="json" out="result">
   <!-- result.name 和 result.age 具有 json 路径的值,因为 map:name 和 map:age 是
        设置在运算器的输入中,结果是输出项的名称。 一旦这个
        op 关闭,结果超出范围,因此请在 arc:call 块内使用值 -->
   <!-- 将姓名和年龄的值设置为消息的标题 -->
  <arc:set attr="output.header:personsname" value="[result.name]" />
  <arc:set attr="output.header:personsage" value="[result.age]" />
</arc:call>

<!-- 设置输出文件并推送文件 -->
<arc:set attr="output.filepath" value="[FilePath]" />
<arc:push item="output" />

该代码执行后,知行之桥将带有新添加的消息头的文件作为输出向下推送到工作流中。

访问 JSON 对象中数组的特定索引

用户经常需要访问 JSON 数据中数组的特定索引。 例如,可能想要访问下面 JSON 对象中 orders 数组中第二个订单对象的 id,该对象作为输入文件传递到 Script 端口。

{
    "warehouseid":"WH1234",
    "orders": [
        {
            "date": "02/27/2023",
            "id": "1234"
        },
        {
            "date": "02/28/2023",
            "id": "5678"
        },
        {
            "date": "03/01/2023",
            "id": "9876"
        }
    ]
}

在 Script 端口中,可以调用 ArcScript 中的 jsonDOMGet 来使用orders数组中某个对象中存在的元素的从 1 开始的索引 jsonpath 来访问特定订单的id。 下面的 ArcScript 代码显示了如何执行此操作的示例:

<!-- 设置输入uri和map参数-->
<arc:set attr="json.uri" value="[FilePath]" />
<arc:set attr="json.map:id" value="/json/orders/\[2\]/id" />

<!-- 调用运算器,传入 json 项并创建“结果”输出项 -->
<arc:call op="jsonDOMGet" in="json" out="result">
  <!-- 将映射的 id 参数的结果设置为消息的消息头 -->
  <arc:set attr="output.header:orderid" value="[result.id]" />
</arc:call>

<!-- 设置输出文件并推送文件 -->
<arc:set attr="output.filepath" value="[FilePath]" />
<arc:push item="output" />

使用repeatelement参数

考虑下面的 JSON 数据,该数据作为输入文件传递到 Script 端口:

{
    "hello": "world",
    "colors": [
        {
            "color": "yellow",
            "example": "banana"
        },
        {
            "color": "red",
            "example": "apple"
        },
        {
            "color": "orange",
            "example": "orange"
        }
    ]
}

在 Script 端口内,针对输入文件执行以下代码。 repeatelement# 参数用于定义具有重复值的元素。 在此示例中, colorexample 值在 /json/colors 元素中重复,该元素是一个 JSON 数组。 当设置 repeatelement# 时,jsonDOMGet 运算器将循环遍历该元素中存在的值。

repeatmode 参数定义 repeatelement# 值存储为输出的方式。 当设置为 ITEM (默认值)时,重复元素找到的值将作为单独的属性存储在输出项上。 当设置为 ARRAY 时,重复元素找到的值将作为数组属性存储在输出项上,并且需要通过基于 1 的索引进行访问(例如, [result.color#2] 将解析为 redresult.example#2 将解析为 apple )。

<!-- 初始化输出数据-->
<arc:set attr="out.data" />
<!-- 设置输入uri、repeatmode和map参数-->
<arc:set attr="json.uri" value="[FilePath]" />
<arc:set attr="json.repeatelement#" value="/json/colors/" />
<arc:set attr="json.repeatmode" value="ITEM" />
<!-- 注意,映射的值是相对于重复元素路径的 -->
<arc:set attr="json.map:color" value="color" />
<arc:set attr="json.map:example" value="example" /> 

<!-- 调用运算器,传入 json 项并创建“结果”输出项 -->
<arc:call op="jsonDOMGet" in="json" out="result">
  <!-- 将输出数据设置为调用的枚举结果-->
  <arc:set attr="out.data">[out.data]
    <arc:enum list="color,example" separator=",">[_value]: [result.[_value]]\n
    </arc:enum>
  </arc:set>
</arc:call>

<!-- 设置输出文件名并推送文件 -->
<arc:set attr="out.filename" value="data.txt" />
<arc:push item="out" />

输出文件:

color: yellow
example: banana
color: red
example: apple
color: orange
example: orange