Json cURL到PowerShell-哈希表

Json cURL到PowerShell-哈希表,json,powershell,curl,hashtable,Json,Powershell,Curl,Hashtable,所以,在发布了我之前的cURL到PowerShell哈希表的问题(该问题已经解决)之后,我现在遇到了一个进一步的问题,这次我将cURL转换为PowerShell,数据(?)中有3个哈希表(或者更可能是我的PowerShell技能)。这一次,我的脚本通过PowerShell返回: ...General Error java.util.LinkedHashMap cannot be cast to java.util.List 以下是通过邮递员完美使用的卷发: curl -X PATCH \

所以,在发布了我之前的cURL到PowerShell哈希表的问题(该问题已经解决)之后,我现在遇到了一个进一步的问题,这次我将cURL转换为PowerShell,数据(?)中有3个哈希表(或者更可能是我的PowerShell技能)。这一次,我的脚本通过PowerShell返回:

...General Error java.util.LinkedHashMap cannot be cast to java.util.List
以下是通过邮递员完美使用的卷发:

curl -X PATCH \
  https://example.com/apis/v1.1/parameters \
  -H 'Authorization: Bearer 1234567890' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '{
    "data": [
        {
            "DUID": 3299,
            "AID": 551,
            "CID": 10002,
            "Parameters": [
                {
                    "name": "Customer.1/AddressLine1",
                    "value": "SOMEWHERE ROAD"
                }
            ]
        }
    ]
}'
下面是PowerShell脚本,我使用前面问题中给出的建议构建了该脚本:

我的$curl参数如下所示:

-X
PATCH
https://example.com/apis/v1.1/parameters
-H
Authorization: Bearer 1234567890
-H
Content-Type: application/json
-H
cache-control: no-cache
-d
{
    \"data\":  {
                 \"CID\":  10002,
                 \"DUID\":  3299,
                 \"AID\":  551,
                 \"Parameters\":  {
                                          \"value\":  \"SOMEWHERE ROAD\",
                                          \"name\":  \"Customer.1/AddressLine1\"
                                      }
             }
}
将返回此错误:

{“状态”:“失败”,“错误”:[{“代码”:“5004”,“名称”:“一般错误”,“严重性”:“3”,“消息”:“操作期间发生错误”,“详细信息”:{“5004”:“一般错误java.util.LinkedHashMap无法转换为java.util.List”}}

“Customer.1/AddressLine1”字段中的正斜杠是否可以?我尝试了第二次替换,但仍然出现相同的错误:

(($Body | ConvertTo-Json) -replace '"', '\"' -replace '/', '\/')
(($Body | ConvertTo-Json) -replace '"', '\"' -replace '/', '\2f')
(($Body | ConvertTo-Json) -replace '"', '\"' -replace '/', '\%2f')
可能是数据哈希表中缺少方括号吗?它们在cURL中,但不在PowerShell中,但是在我以前的脚本中,我没有方括号,加上PowerShell似乎不喜欢它们

PowerShell是否会更改“值”和“名称”的顺序

如蒙协助,将不胜感激

更新 多亏@mklement0的帮助,我已经将我的PowerShell编辑为以下版本,解决了这个问题

$Body =   @{
      data = , @{
      DUID = 3299
      AID = 551
      CID = 10002
      Parameters = , @{
         name = "Customer.1/AddressLine1"
         value = "SOMEWHERE ROAD"
                             }
                }
            }

$CurlArgument = '-X', 'PATCH',
                'https://example.com/apis/v1.1/parameters',
                '-H', 
                $AuthBearer,
                '-H', 'Content-Type: application/json',
                '-H', 'cache-control: no-cache',
                '-d', 
                (($Body | ConvertTo-Json -Depth 4) -replace '"', '\"')

& $CURLEXE @CurlArgument
提供关键指针:

您的JSON格式需要一个子对象数组(
[…]
)作为
数据
数据的值。参数
属性,而您在
$Body
中构建的看似等价的哈希表只有一个标量子对象

需要对代码进行两个调整:

  • 确保
    数据
    数据。参数
    包含数组

    • 使用
      构造包含
      的单个元素数组
      converttojson
      自动将数组转换为Json
      […]
      符号
  • -Depth 4
    转换为Json
    一起使用,以确保对象层次结构中的所有子对象都完整表示


第一节中的主体在括号中有一个JSON数组。第二个不是数组,根据我对JSON的理解,它是一个哈希表。这就是您在PoSh版本中用
@{}
而不是
@()
定义的内容。非常感谢@mklement0-我的URL后缺少一个逗号,这意味着我的$authBearner没有被发送,但是您上面建议的修改修复了我的问题!出于兴趣,所有这些都记录在哪里了,这样我就可以做一些阅读/学习了?很高兴听到这些,@Simon。PowerShell的帮助主题不仅针对特定的cmdlet(例如,
Get-help ConvertTo Json
),还针对各种概念主题:
Get-help about_Hash_Tables
Get-help about_Splatting
。虽然有关于“引用”规则的
获取帮助,但它不包括调用外部程序的附加要求;你可以了解他们。
$Body =   @{
      data = , @{
      DUID = 3299
      AID = 551
      CID = 10002
      Parameters = , @{
         name = "Customer.1/AddressLine1"
         value = "SOMEWHERE ROAD"
                             }
                }
            }

$CurlArgument = '-X', 'PATCH',
                'https://example.com/apis/v1.1/parameters',
                '-H', 
                $AuthBearer,
                '-H', 'Content-Type: application/json',
                '-H', 'cache-control: no-cache',
                '-d', 
                (($Body | ConvertTo-Json -Depth 4) -replace '"', '\"')

& $CURLEXE @CurlArgument
$CURLEXE = 'C:\Windows\System32\curl.exe'
$URL1 = "https://example.com/apis/v1.1/parameters"

$Body = @{
  data = , @{ # Note the "," to construct an *array*
    DUID = 3299
    AID = 551
    CID = 10002
    Parameters = , @{ # Note the "," to construct an *array*
       name = "Customer.1/AddressLine1"
       value = "SOMEWHERE ROAD"
    }
  }
}

# Note the -Depth 4 in the ConvertTo-Json call.
$CurlArgument = '-X', 'PATCH',
                $URL1,
                '-H', 
                $AuthBearer,
                '-H', 'Content-Type: application/json',
                '-H', 'cache-control: no-cache',
                '-d', 
                (($Body | ConvertTo-Json -Depth 4) -replace '"', '\"')


& $CURLEXE @CurlArgument