json PowerShell:将curl GET响应转换为数组时出现问题

kcugc4gi  于 2023-07-01  发布在  Shell
关注(0)|答案(1)|浏览(157)

我无法使用ConvertFrom-Json将PowerShell中使用curl接收到的GET响应转换为数组。该请求正在从Web应用程序中提取用户列表。几个JSON验证器说JSON是有效的(FWIW)。结果看起来像是从JSON转换的数据被塞进了数组中的一个元素。

JSON示例:

{"adRecordsSize":0,"azureRecordSize":0,"manualRecordsSize":76,"records":[{"id":"0-0","key":"someone","position":0,"sourceType":"Manual"},{"id":"0-1","key":"someone1","position":1,"sourceType":"Manual"},{"id":"0-2","key":"someone2","position":2,"sourceType":"Manual"},{"id":"0-3","key":"someone3","position":3,"sourceType":"Manual"}],"tisRecordsSize":0}

我正在寻找的结果是一个我可以使用的数组,类似于这样(实际上我需要的只是用户名):

id  key  position  sourceType
0-0  someone  0  Manual
0-1  someone1  1  Manual
0-2  someone2  2  Manual
0-3  someone3  3  Manual

下面是我尝试的第一个代码,它至少产生了一些东西:

$request = @()
$request= curl.exe -H "Csrf-Token:nocheck" -H $token -H "Content-Type: application/json" -H "Accept: application/json" $uri | ConvertFrom-Json
$request

下面的结果看起来像是所有的东西都被塞进了一个元素或属性中(请原谅我缺乏术语),但是我期望的是一个数组,它包含了我从中提取的表中的每个项目的元素。或者这是ConvertFrom-Json没有像它应该的那样分割的多个元素吗?:

adRecordsSize     : 0
azureRecordSize   : 0
manualRecordsSize : 3
records           : {@{id=0-0; key=someone; position=0; sourceType=Manual}, @{id=0-1; key=someone1; position=1; sourceType=Manual}, @{id=0-2; key=someone2; position=2; sourceType=Manual}, @{id=0-3; key=someone3; position=3; 
                    sourceType=Manual}...}
tisRecordsSize    : 0

所以我试着:

$request = curl.exe -H "Csrf-Token:nocheck" -H $token -H "Content-Type: application/json" -H "Accept: application/json" $uri | Select-Object -Property records | ConvertFrom-Json

这将导致空数组。我在管道中将select-object命令更改为“Select-Object -Property *”:同样的空数组。
现在我试着这样做:

$request = curl.exe -H "Csrf-Token:nocheck" -H $token -H "Content-Type: application/json" -H "Accept: application/json" $uri
$data = ConvertFrom-Json -InputObject $request 
$data

结果和我尝试的第一步一样!
所以现在这个:

$request = [System.Collections.ArrayList]@()
$request = curl.exe --request GET -H "Csrf-Token:nocheck" -H $token -H "Content-Type: application/json" -H "Accept: application/json" $uri | Select-Object -Property * | ConvertFrom-Json
$request

结果:"ConvertFrom-Json : Invalid JSON primitive: ."
我尝试了其他一些排列,包括在ConvertFrom-Json之前使用Out-String,但没有成功。有没有人有办法解决这个问题??

ohtdti5x

ohtdti5x1#

正如注解中提到的,这只是PowerShell试图通过显示实际存储在records属性中的更复杂对象的紧凑字符串表示来提供帮助。
如果让它只显示records值,您将确切地看到您要查找的内容:

PS ~> $request.records

id  key      position sourceType
--  ---      -------- ----------
0-0 someone         0 Manual
0-1 someone1        1 Manual
0-2 someone2        2 Manual
0-3 someone3        3 Manual

PS ~> $request.records |Format-List

id         : 0-0
key        : someone
position   : 0
sourceType : Manual

id         : 0-1
key        : someone1
position   : 1
sourceType : Manual

id         : 0-2
key        : someone2
position   : 2
sourceType : Manual

id         : 0-3
key        : someone3
position   : 3
sourceType : Manual

相关问题