问题描述
我们正在使用 Inovke-RestMethod 响应。作为响应的一部分,我们有一个数组:
$array = @(
{
id = "9916"
title = "title9916"
}
{
id = "9917"
title = "title9917"
}
)
我们注意到数组中的每一项都被视为 ScriptBlock:
PS C:\> $array | % { $_.GetType() }
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True ScriptBlock System.Object
True True ScriptBlock System.Object
如何让每一项都可迭代?
附注。当 ScriptBlock 被指定为:
$scriptblock = {
id = "9916"
title = "title9916"
}
我们可以通过以下方式转换为 HashTable:
PS C:\> $hash = ConvertFrom-StringData -StringData $scriptblock.ToString()
如果 ScriptBlock 被指定为:
$scriptblock = {
id = "9916"
title = "title9916"
details = @{
name = "name9916"
count = 128
}
}
在这种情况下 ConvertFrom-StringData 将不起作用。
附注。对于那些好奇的人:我们正在使用 ManageEngine ServiceDesk Plus v3
响应是作为 PSCustomObject 给出的,我们只需要它的某个子集。这个子集可以随时间变化,它被定义为 XML 文件中的一个列表。根据该列表,我们应该处理我们的响应。我们认为实现这一目标的最佳方式是将 PSCustomObject 转换为 XML 并使用函数:
- 选择节点
- 选择单节点
- GetElementsByTagName
为了将 PSCustomObject 转换为 XML,我们使用了脚本的修改版本:
https://www.manageengine.com/products/service-desk/sdpod-v3-api/SDPOD-V3-API.html#get-request
在处理数组之前,它可以完美运行。
解决方法
正如评论中提到的,您的 allDates.add(m.group(1));
不是有效的 JSON - 我可以想象返回的类型“scriptblock”可能会产生误导,但在这种情况下,它与 powershell 块有关脚本,而不是 javascript。
我不确定它的内容发生了什么变化,但如果它是 JSON,它会是这样的:
$array
这是从中获取可用数据的方法:
$array = @"
[{
id: "9916",title: "title9916"
},{
id: "9917",title: "title9917"
}]
"@