使用PowerShell提取JSON嵌套字段signing_certificate_id失败求助
问题:无法导出JSON嵌套字段
signing_certificate_id到CSV 我尝试从JSON文件中提取signing_certificate_id字段,但该字段的数据无法导出到CSV文件,其他信息(如name、contact_info)可正常导出。部分JSON文件中存在两组相同结构的代码块,用于代表不同环境。
JSON片段示例
{ "sfg_ping::production::standard_sp_connections": [ { "name": "hhhh", "entity_id": "https://hhhh.hhhh.com", "contact_info": "hhhh@hhhh.com", "sp_endpoint": "https://hhhh.hhhh.com/", "sso_initialization_and_signature_policy": { "sign_assertion_or_response": "assertion", "sp_trust_model": "unanchored", "signing_certificate_id": "gggggg", "sp_initiated": { "require_signed_authn_requests": false } } } ] }
当前使用的PowerShell脚本
Get-ChildItem "C:\Users\hhhh\appdev\targetfolder-json2" -Filter *.json -PipelineVariable file | ForEach-Object { (Get-Content $_.pspath -Raw | ConvertFrom-Json).PSObject.Properties.Value | Select-Object @( @{ l = 'filename'; e = { $file.Name }}, 'Name','contact_info', 'signing_certificate_id' ) } | Export-Csv path\to\myexport.csv -NoTypeInformation
问题原因与解决方案
问题出在signing_certificate_id是嵌套在sso_initialization_and_signature_policy对象内部的字段,直接在Select-Object中指定字段名无法识别嵌套层级。需要通过计算属性来深入读取嵌套字段的值。
修改后的脚本如下:
Get-ChildItem "C:\Users\hhhh\appdev\targetfolder-json2" -Filter *.json -PipelineVariable file | ForEach-Object { (Get-Content $_.pspath -Raw | ConvertFrom-Json).PSObject.Properties.Value | Select-Object @( @{ l = 'filename'; e = { $file.Name }}, 'Name', 'contact_info', @{ l = 'signing_certificate_id'; e = { $_.sso_initialization_and_signature_policy?.signing_certificate_id }} ) } | Export-Csv path\to\myexport.csv -NoTypeInformation
关键改动说明
- 将原脚本中的
'signing_certificate_id'替换为计算属性:@{ l = 'signing_certificate_id'; e = { $_.sso_initialization_and_signature_policy?.signing_certificate_id }} - 使用
?.(空条件运算符)可以避免因部分JSON对象缺少sso_initialization_and_signature_policy字段而报错,此时对应位置会导出空值。
内容的提问来源于stack exchange,提问作者Ben S
相关产品推荐
相关产品推荐

