在 powershell 中序列化 REST 响应
Serialize REST response in powershell
我正在连接到 REST 服务
$response = Invoke-RestMethod -Uri $URL -Headers $headers -Method POST -Body $body_json -ContentType "application/json"
$response.Outputs
我收到了那种格式的回复
Actual: {
"2017-08-29T14:37:47.137",
"2017-08-30T13:07:09.563",
"2017-08-30T14:41:29.023"
},
Start: {
"2017-08-29T14:36:12.42",
"2017-08-30T12:59:53.05",
"2017-08-30T14:40:45.34"
},
NumScrapsList: {
0,
3,
...
但我想要那种形式
{
"NumScrapsList":0,
"Actual":"2017-08-29T14:37:47.137",
"Start":"08-29T14:36:12.42"
},
{
"NumScrapsList":3,
"Actual":"2017-08-30T13:07:09.563",
"Start":"2017-08-30T12:59:53.05"
}
在 pythonic 方法中,我可以这样做(包括“输出”键):
outputs = [dict(zip(resp['Outputs'].keys(), e))
for e in zip(*resp['Outputs'].values())]
pprint(outputs)
但在 powershell 中我不知道该怎么做。你能告诉我正确的方向吗?
使用 Invoke-RestMethod
中的完整 $response.outputs 编辑
$response.outputs 是
Type : {a, b, c}
Code : {xxx, yyy, eee}
CompletionDate : {1900-01-01T00:00:00, 1900-01-01T00:00:00, 1900-01-01T00:00:00}
OrderQuantity : {30, 30, 3}
NumScraps : {0, 0, 0}
ActualDate : {2021-11-16T15:17:00, 2021-11-16T15:18:00, 1900-01-01T00:00:00}
Status : {WT, FD, RT}
Order : {70000, 30794, 94098}
Sequence : {0300, 0400, 0500}
然后我可以转换为-json,输出是:
{
"Type": [
"a",
"b",
"c"
],
"Code": [
"xxx",
"yyy",
"eee"
],
"CompletionDate": [
"1900-01-01T00:00:00",
"1900-01-01T00:00:00",
"1900-01-01T00:00:00"
],
"OrderQuantity": [
30,
30,
3
],
"NumScraps": [
0,
0,
0
],
"ActualDate": [
"2021-11-16T15:17:00",
"2021-11-16T15:18:00",
"1900-01-01T00:00:00"
],
"Status": [
"WT",
"FD",
"RT"
],
"Order": [
"70000",
"30794",
"94098"
],
"Sequence": [
"0300",
"0400",
"0500"
]
}
那是说 waitingforguacamole 解决方案即使有点棘手也能奏效(当然,谢谢你的帮助!)
好吧,我试了一下,也许不够优雅(它既不是功能性的也不是 Pythonic 的),我相信其他人会有 far 更具表现力的方法,但这可能是一个开始:
我清理了 JSON 看起来像这样
{
"Actual": [
"2017-08-29T14:37:47.137",
"2017-08-30T13:07:09.563",
"2017-08-30T14:41:29.023"
],
"Start": [
"2017-08-29T14:36:12.42",
"2017-08-30T12:59:53.05",
"2017-08-30T14:40:45.34"
],
"NumScrapsList": [
0,
3,
7
]
}
(为了完整性,我在NumScrapsList
中加了一个值,并将每个顶级JSON字段变成了一个数组)
然后,
#simulate your REST method call result
$json = "{
`"Actual`": [
`"2017-08-29T14:37:47.137`",
`"2017-08-30T13:07:09.563`",
`"2017-08-30T14:41:29.023`"
],
`"Start`": [
`"2017-08-29T14:36:12.42`",
`"2017-08-30T12:59:53.05`",
`"2017-08-30T14:40:45.34`"
],
`"NumScrapsList`": [
0,
3,
7
]
}"
#create a field map
$fieldMap = @("NumScrapsList", "Start", "Actual")
#convert the JSON to a Powershell object, create an empty array
$in = $json | ConvertFrom-JSON
#using NumScrapsList as your iterator
0..($in.NumScrapsList.Count-1) | ForEach-Object {
$fieldMap | ForEach-Object -Begin {
#reference the outer loop index
$index = $_
#initialize an accumulator for the object whose properties to be mapped
$obj = @{}
} -Process {
#in order of fieldMap's properties, grab those fields from the input
#and add them to the accumulator by name
$obj."$_" = $in."$_"[$index]
} -End {
#return that accumulator
$obj
}
} | ConvertTo-Json
并且该处理块可以减少为:
$fieldMap = @("NumScrapsList", "Start", "Actual");
$in = $json | ConvertFrom-JSON
0..($in.NumScrapsList.Count-1) | ForEach-Object {
$fieldMap | ForEach-Object { $index = $_; $obj = @{} } {
$obj."$_" = $in."$_"[$index]
} { $obj }
} | ConvertTo-Json
我正在连接到 REST 服务
$response = Invoke-RestMethod -Uri $URL -Headers $headers -Method POST -Body $body_json -ContentType "application/json"
$response.Outputs
我收到了那种格式的回复
Actual: {
"2017-08-29T14:37:47.137",
"2017-08-30T13:07:09.563",
"2017-08-30T14:41:29.023"
},
Start: {
"2017-08-29T14:36:12.42",
"2017-08-30T12:59:53.05",
"2017-08-30T14:40:45.34"
},
NumScrapsList: {
0,
3,
...
但我想要那种形式
{
"NumScrapsList":0,
"Actual":"2017-08-29T14:37:47.137",
"Start":"08-29T14:36:12.42"
},
{
"NumScrapsList":3,
"Actual":"2017-08-30T13:07:09.563",
"Start":"2017-08-30T12:59:53.05"
}
在 pythonic 方法中,我可以这样做(包括“输出”键):
outputs = [dict(zip(resp['Outputs'].keys(), e))
for e in zip(*resp['Outputs'].values())]
pprint(outputs)
但在 powershell 中我不知道该怎么做。你能告诉我正确的方向吗?
使用 Invoke-RestMethod
中的完整 $response.outputs 编辑$response.outputs 是
Type : {a, b, c}
Code : {xxx, yyy, eee}
CompletionDate : {1900-01-01T00:00:00, 1900-01-01T00:00:00, 1900-01-01T00:00:00}
OrderQuantity : {30, 30, 3}
NumScraps : {0, 0, 0}
ActualDate : {2021-11-16T15:17:00, 2021-11-16T15:18:00, 1900-01-01T00:00:00}
Status : {WT, FD, RT}
Order : {70000, 30794, 94098}
Sequence : {0300, 0400, 0500}
然后我可以转换为-json,输出是:
{
"Type": [
"a",
"b",
"c"
],
"Code": [
"xxx",
"yyy",
"eee"
],
"CompletionDate": [
"1900-01-01T00:00:00",
"1900-01-01T00:00:00",
"1900-01-01T00:00:00"
],
"OrderQuantity": [
30,
30,
3
],
"NumScraps": [
0,
0,
0
],
"ActualDate": [
"2021-11-16T15:17:00",
"2021-11-16T15:18:00",
"1900-01-01T00:00:00"
],
"Status": [
"WT",
"FD",
"RT"
],
"Order": [
"70000",
"30794",
"94098"
],
"Sequence": [
"0300",
"0400",
"0500"
]
}
那是说 waitingforguacamole 解决方案即使有点棘手也能奏效(当然,谢谢你的帮助!)
好吧,我试了一下,也许不够优雅(它既不是功能性的也不是 Pythonic 的),我相信其他人会有 far 更具表现力的方法,但这可能是一个开始:
我清理了 JSON 看起来像这样
{
"Actual": [
"2017-08-29T14:37:47.137",
"2017-08-30T13:07:09.563",
"2017-08-30T14:41:29.023"
],
"Start": [
"2017-08-29T14:36:12.42",
"2017-08-30T12:59:53.05",
"2017-08-30T14:40:45.34"
],
"NumScrapsList": [
0,
3,
7
]
}
(为了完整性,我在NumScrapsList
中加了一个值,并将每个顶级JSON字段变成了一个数组)
然后,
#simulate your REST method call result
$json = "{
`"Actual`": [
`"2017-08-29T14:37:47.137`",
`"2017-08-30T13:07:09.563`",
`"2017-08-30T14:41:29.023`"
],
`"Start`": [
`"2017-08-29T14:36:12.42`",
`"2017-08-30T12:59:53.05`",
`"2017-08-30T14:40:45.34`"
],
`"NumScrapsList`": [
0,
3,
7
]
}"
#create a field map
$fieldMap = @("NumScrapsList", "Start", "Actual")
#convert the JSON to a Powershell object, create an empty array
$in = $json | ConvertFrom-JSON
#using NumScrapsList as your iterator
0..($in.NumScrapsList.Count-1) | ForEach-Object {
$fieldMap | ForEach-Object -Begin {
#reference the outer loop index
$index = $_
#initialize an accumulator for the object whose properties to be mapped
$obj = @{}
} -Process {
#in order of fieldMap's properties, grab those fields from the input
#and add them to the accumulator by name
$obj."$_" = $in."$_"[$index]
} -End {
#return that accumulator
$obj
}
} | ConvertTo-Json
并且该处理块可以减少为:
$fieldMap = @("NumScrapsList", "Start", "Actual");
$in = $json | ConvertFrom-JSON
0..($in.NumScrapsList.Count-1) | ForEach-Object {
$fieldMap | ForEach-Object { $index = $_; $obj = @{} } {
$obj."$_" = $in."$_"[$index]
} { $obj }
} | ConvertTo-Json