Power Automate中动态获取JSON内Hours对象的日期列表头问题
问题背景
现有JSON数据如下:
[ { "TimePeriod": "12/12/23 - 12/26/23", "ResourceName": "rob brien", "TimesheetStatus": "Submitted", "SubmittedBy": "rob brien", "LastModified": "12/12/23 7:12 AM", "InvestmentTasks": [ { "InvestmentID": "PRO13796", "Investment": "Credit Risk Regulatory ", "Description": "A3-Dev/Build", "Hours": { "12/12": 9, "12/13": 9, "12/14": 9, "12/15": 9, "12/16": 9, "12/17": 0, "12/18": 9, "12/19": 9, "12/20": 9, "12/21": 0, "12/22": 9, "12/23": 9, "12/24": 9, "12/25": 9, "12/26": 9, "Total": 99 } } ] } ]
在Power Automate的「添加行到表格」步骤中,由于Hours对象下的日期键是动态的(数量、所属月份均不固定),无法固定映射Excel表头。尝试用Xpath函数处理,步骤如下:
- Xpath步骤:
xpath(xml(body('Parse_JSON_Hours')), '/Hours/*') - 应用到每个步骤:传入Xpath输出
- 每个项:
xpath(item(), 'name(/*)')
但触发错误:
Unable to process template language expressions in action 'xpath' inputs at line '0' and column '0': 'The template language function 'xml' parameter is not valid. The provided value cannot be converted to XML: 'JSON root object has multiple properties. The root object must have a single property in order to create a valid XML document. Consider specifying a DeserializeRootElementName. Path 'outputs.body.Sat_12_2
需要动态获取日期列表头,实现如下预期输出:
12/12 12/13 9 9 so on...
错误原因
直接将Hours的JSON对象传入xml()函数会报错,因为XML要求根节点唯一,而Hours本身是多属性的JSON对象,没有单一根元素,不符合XML转换的要求。
解决方案
方法1:修复XML转换的根节点问题
修改Xpath步骤的表达式,先给Hours对象包裹一个根节点,再转换为XML:
xpath(xml(concat('<Root>', json(body('Parse_JSON_Hours')), '</Root>')), '/Root/*')
之后在「应用到每个」步骤中,分别获取节点信息:
- 获取日期(表头):
xpath(item(), 'name(/*)') - 获取对应小时数:
xpath(item(), 'text(/*)')
方法2:使用keys()函数直接提取动态键(更高效)
无需依赖Xpath,直接用Power Automate内置的keys()函数提取Hours的所有键:
- 获取所有键(包含
Total):keys(body('Parse_JSON_Hours'))
返回结果为数组格式:['12/12', '12/13', ..., 'Total'] - 若需排除
Total,用filter()函数过滤:filter(keys(body('Parse_JSON_Hours')), item() != 'Total') - 在「应用到每个」步骤中,获取对应日期的小时数:
body('Parse_JSON_Hours')[item()]
动态映射Excel表头与行数据
- 先将提取到的日期数组作为表头,写入Excel的表头行
- 提取对应小时数数组,与其他固定字段(如
ResourceName、Investment等)组合,通过「添加行到表格」步骤完成动态列映射
内容的提问来源于stack exchange,提问作者tom

