【问题标题】:Can I get hierarchy path for property in json using powershell?我可以使用powershell获取json中属性的层次结构路径吗?
【发布时间】:2020-10-04 13:48:55
【问题描述】:

考虑那个 json 对象:

@"
        {
          ""Logging"": {
            ""LogLevel"": {
              ""Default"": ""Warning""
            }
          },
          ""AllowedHosts"": ""*"",
          ""ConnectionStrings"": {
            ""ConnectionString1"": """",
            ""ConnectionString2"": """",
            ""ConnectionString3"": """"
            }}"; 

我想在 powershell 中编写一个函数,它将获取该 json 并搜索某些属性并返回它的路径。例如,如果函数名称是 ReturnHierarchyPath(json, propertyName)

当我称之为 ReturnHierarchyPath(json, "ConnectionString1") 时,返回应该是 "ConnectionStrings.ConnectionString1"

我在 C# 中实现了这个,但我想知道它是否可以在 powershell 脚本中实现?

以下是 C# 代码示例:https://dotnetfiddle.net/N5ccWY

【问题讨论】:

    标签: json powershell parsing


    【解决方案1】:

    在您的 C# 示例中,您依赖 LINQ 来完成一些繁重的工作。

    要在 Powershell 中执行此操作,我认为最简单的方法是将 JSON 转换为 Powershell 对象,然后在存储构建路径的同时递归地评估所有属性。

    [CmdletBinding()] 和 Verbose 的东西不是必需的,但我发现在编写这样的函数时能够看到执行流程是非常有用的。

    我认为这几乎完全符合您的要求:

    Function ReturnHierarchy {
        [CmdletBinding()]
        Param(
            [PSObject]$Object,
            [string]$PropertyName,
            [string[]]$Path = @()
        )
    
        if (!$Object) { return }
    
        return $Object.PSObject.Properties.Name | % {
            Write-Verbose "Checking property $(($Path + $_) -join ".")"
            ReturnHierarchy -Object $Object.$_ -PropertyName $PropertyName -Path ($Path + $_)
    
            if ($_ -like $PropertyName)  {
                return ($Path + $_) -join "."
            }
        }
    }
    
    $obj = @"
    {
        "Logging": {
            "LogLevel": {
                "Default": "Warning"
            }
        },
        "AllowedHosts": "*",
        "ConnectionStrings": {
            "ConnectionString1": "",
            "ConnectionString2": "",
            "ConnectionString3": ""
        }
    }
    "@ | ConvertFrom-Json
    
    ReturnHierarchy -Object $obj -PropertyName "ConnectionString1" -Verbose
    

    【讨论】:

    • 非常感谢@Cbsch!这正是我正在寻找的。我相信其他人也会发现这个功能非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多