首页 > 解决方案 > 过滤 JSON - 获取非空值

问题描述

当我从 Excel 读取行时,我得到 JSON 响应:

body: {
    "1": "",
    "2": "X",
    "3": "Y",
    "4": "",
    ...
}

一行代表一年 - 365 天,其中每天可能包含一些单字母信息(X、Y、Z..)或""- 问题是现在我必须访问所有 365 天,这需要很长时间。

我只需要访问那些!= "",有没有可能怎么做?谢谢

在此处输入图像描述

标签: jsonexcelpower-automate

解决方案


使用带有 xpath() 和 xml() 函数的表达式来解析数据,然后在 Power Automate 中以本机方式重新解析该数据。

我建议我认为,无论您为谁使用此解决方案,都可能不是在 excel 中处理这些数据的理想位置。最好将其放置在 SharePoint 列表或某种数据库中,因为您要存储数据以供后续处理。一旦到了那里,这些困难就不会那么普遍了。

以下流程将获得您需要的内容:

在此处输入图像描述

此流程基于John Liu 出色的 Power Automate XML hack,它(在流程准备好之后)将 JSON 对象转换为 XML。我建议阅读以了解此处的步骤。

一旦 XML 已被询问字段名称和值,并将其放入新数组(在 Select 操作中),则可以将其过滤为非空值。从那时起,您可以随意处理。


细节:

  1. rootification - 这将对象放置在xpath()函数可以解析的结构中。

  2. xmlifyxml() - 这使用andxpath()函数将对象转换为 XML 字符串。

  3. 为 JSON 数组选择- 这将使用 xml 中的字段名称和字段值创建一个新数组。我稍后会分解这一步。

  4. 过滤器数组- 这用于item()['Value']检查您创建的字段的结果。任何非空白的都将在它创建的最终数组中。

如果您希望清除操作,可以将数字 1、2 和 3 组合到“发件人”字段中:

xpath(xml(json(concat('{ "root": ', string(variables('excel')), ' }'))), '/root/*')

在此处输入图像描述

在 Select for JSON array 操作中:

if(startsWith(string(xpath(item(), 'name(/*)')), '_x003'), if(equals(length(string(xpath(item(), 'name(/*)'))), 7), substring(string(xpath(item(), 'name(/*)')), 5, 1), concat(substring(string(xpath(item(), 'name(/*)')), 5, 1), substring(string(xpath(item(), 'name(/*)')), 7))), string(xpath(item(), 'name(/*)')))

真正需要关注的重要部分是真正的分支——xpath(item(), 'name(/*)')函数xpath()将从 XML 中提取字段的名称。

嵌套 if/then 结构的第一层检查 XML 字段名称是否以“_x003”开头(我假设它表示整数/数字),如果以该开头,则执行下一段,否则将简单地返回字段名称作为字符串。

第二层查看数字字段名称,因此如果您只是xpath(item(), 'name(/*)')在其中使用字段“1”,则结果将提供“ x0003 1 ”。“3”和最后一个下划线之间的“1”是字段名称。当您达到双字符(任何类型)时,它将下一个字符放在最后一个下划线之后。因此,上面公式的其余部分是一种万能的方法(适用于任何阅读者),它将将该字段名称中的任何内容处理到 JSON 中。如果需要,我会分解它。

xpath(item(),'string(//*)')

'Value'字段用于xpath()从先前生成的 XML 中的每个项目中提取值。


推荐阅读