我想得到一个Hashtable的JSON表示,如下所示:
@{Path="C:\temp"; Filter="*.js"}
Run Code Online (Sandbox Code Playgroud)
ConvertTo-Json 结果是:
{
"Path": "C:\\temp",
"Filter": "*.js"
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您将JSON字符串转换回来,ConvertFrom-Json则不会获得HashTable,而是获得PSCustomObject.
那么如何才能可靠地序列化上面的Hashmap呢?
我想monkeypatch PowerShell 2.0环境,目前无法升级到3.0.
我正在寻找PowerShell 3.0中的ConvertFrom-Jsoncmdlet和ConvertTo-Jsoncmdlet 的PowerShell 2.0脚本实现.
我最感兴趣的是ConvertFrom-Json,但ConvertTo-Json也很好.
我有一个json文件(test.json),看起来像这样:
{
"root":
{
"key":"value"
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用类似这样的东西将它加载到powershell中:
PS > $data = [System.String]::Join("", [System.IO.File]::ReadAllLines("test.json")) | ConvertFrom-Json
root
----
@{key=value}
Run Code Online (Sandbox Code Playgroud)
我希望能够枚举由json文件定义的'hashtable'之类的对象的键. 所以,理想情况下,我希望能够做到这样的事情:
$data.root.Keys
Run Code Online (Sandbox Code Playgroud)
并得到["关键"].我可以使用PowerShell中的内置哈希表来做到这一点,但是使用从json加载的哈希表来做这件事并不那么明显.
在对此进行故障排除时,我注意到ConvertFrom-json返回的字段与Powershell的哈希表的字段类型不同.例如,在内置哈希表上调用.GetType()会显示它的类型为'Hashtable':
PS > $h = @{"a"=1;"b"=2;"c"=3}
PS > $h.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Hashtable System.Object
Run Code Online (Sandbox Code Playgroud)
为我的json对象做同样的事情会产生PSCustomObject:
PS > $data.root.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object
Run Code Online (Sandbox Code Playgroud)
有没有办法将此对象转换或转换为典型的PowerShell Hashtable?
有没有一种巧妙的方法可以将 a 转换PSCustomObject为自定义类作为 PowerShell 5.1 中的函数参数?自定义对象包含附加属性。
我希望能够做这样的事情:
class MyClass {
[ValidateNotNullOrEmpty()][string]$PropA
}
$input = [pscustomobject]@{
PropA = 'propA';
AdditionalProp = 'additionalProp';
}
function DuckTypingFtw {
[CmdletBinding()]
param(
[Parameter(Mandatory = $True, Position = 0, ValueFromPipeline)] [MyClass] $myObj
)
'Success!'
}
DuckTypingFtw $input
Run Code Online (Sandbox Code Playgroud)
不幸的是Success!,我得到的不是:
DuckTypingFtw:无法处理参数“myObj”的参数转换。无法将值“@{PropA=propA;AdditionalProp=additionalProp}”转换为类型“MyClass”。错误:“无法转换”@{PropA=propA; “AdditionalProp=additionalProp}”
类型“System.Management.Automation.PSCustomObject”的值要键入“MyClass”。在 C:\temp\tmp.ps1:23 字符:15 + DuckTypingFtw $input + ~~~~~~ + CategoryInfo : InvalidData: (:) [DuckTypingFtw], ParameterBindingArgumentTransformationException + ExcellentQualifiedErrorId : ParameterArgumentTransformationError,DuckTypingFtw
如果我注释掉AdditionalProp,一切正常。
基本上,我想要实现的目标是从一个函数返回一个对象并将其传递给第二个函数,同时确保第二个函数的参数具有所有预期的属性。
我想逐行打印自定义对象中的所有项目.我用过的陈述是:
TestObject ([PSCustomObject]@{item1=1 ;item2=2; item3=3},[PSCustomObject]@{item1=4;item2=5;item3=6}) -Verbose
Run Code Online (Sandbox Code Playgroud)
我的功能定义如下:
function TestObject
{
[CmdLetBinding()]
Param(
[parameter(Mandatory=$True]
[object[]]$objectNames
)
Begin{}
Process
{
foreach ($object in $objectNames)
{
$myItems =@()
$myItems += $object
foreach ($o in $myItems.GetEnumerator())
{
Write-Verbose "---------------$o--------------"
foreach ($i in $o)
{
Write-Verbose "Name:$i.Key Value:$i.Value"
}
}
Write-Verbose "$object"
}
}
End{}
}
Run Code Online (Sandbox Code Playgroud)
我期望输出如下:
VERBOSE: ---------------@{item1=1; item2=2; item3=3}--------------
VERBOSE: Name:item1 Value:1
VERBOSE: Name:item2 Value:2
VERBOSE: Name:item3 Value:3
VERBOSE: @{item1=1; item2=2; item3=3}
VERBOSE: ---------------@{item1=4; item2=5; item3=6}--------------
VERBOSE: Name:item1 Value:4
VERBOSE: Name:item2 Value:5
VERBOSE: …Run Code Online (Sandbox Code Playgroud)