gpt4 book ai didi

json - ConvertFrom-json中的哈希表与Powershell内置哈希表的类型不同,如何使它们相同?

转载 作者:行者123 更新时间:2023-12-03 20:09:14 29 4
gpt4 key购买 nike

我有一个看起来像这样的json文件(test.json):

{
"root":
{
"key":"value"
}
}

我正在使用类似这样的东西将其加载到powershell中:
PS > $data = [System.String]::Join("", [System.IO.File]::ReadAllLines("test.json")) | ConvertFrom-Json

root
----
@{key=value}

我希望能够枚举json文件定义的“哈希表”之类的对象的键。 因此,理想情况下,我希望能够执行以下操作:
$data.root.Keys

然后取回[“key”]。我可以使用powershell中的内置哈希表执行此操作,但是使用从json加载的哈希表执行此操作不太明显。

在对此进行故障排除时,我注意到ConvertFrom-json返回的字段具有与Powershell哈希表不同的类型。例如,在内置哈希表上调用.GetType()可以表明其类型为“哈希表”:
PS > $h = @{"a"=1;"b"=2;"c"=3}
PS > $h.GetType()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Hashtable System.Object

对我的json对象执行相同操作会产生PSCustomObject:
PS > $data.root.GetType()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object

是否有任何方法可以将该对象强制转换或转换为典型的Powershell Hashtable?

最佳答案

ConvertFrom-Json cmdlet为您提供了一个自定义对象,因此您必须使用点表示法而不是作为下标来访问它们。通常,您会知道期望在JSON中使用哪些字段,因此,与获取哈希表相比,这实际上通常更有用。我建议您使用它,而不是通过转换回哈希表来对抗系统。

您可以将select与通配符属性名称一起使用以获取属性:

PS D:\> $data = @"
{
"root":
{
"key":"value", "key2":"value2", "another":42
}
}
"@ | ConvertFrom-Json

PS D:\> $data.root | select * | ft -AutoSize

key key2 another
--- ---- -------
value value2 42



PS D:\> $data.root | select k* | ft -AutoSize

key key2
--- ----
value value2

Get-Member(如果要提取可迭代的属性名称列表):
PS D:\> ($data.root | Get-Member -MemberType NoteProperty).Name
another
key
key2

将其放入循环中可以得到如下代码:
PS D:\> foreach ($k in ($data.root | Get-Member k* -MemberType NoteProperty).Name) {
Write-Output "$k = $($data.root.$k)"
}
key = value
key2 = value2

关于json - ConvertFrom-json中的哈希表与Powershell内置哈希表的类型不同,如何使它们相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22002748/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com