cURL для PowerShell - таблица хэшей

Итак, после публикации моего предыдущего вопроса cURL в PowerShell Hash Table (который был решен), я теперь столкнулся с дополнительной проблемой, конвертирующей cURL в PowerShell на этот раз с 3 хэш-таблицами в данных (?) (Или, более вероятно, мои навыки PowerShell ). На этот раз мой скрипт через PowerShell возвращает:

...General Error java.util.LinkedHashMap cannot be cast to java.util.List

Вот cURL, который отлично работает через Postman:

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 to PowerShell - Двойная хеш-таблица в --data?

$CURLEXE = 'C:WindowsSystem32curl.exe'
$URL1 = "https://example.com/apis/v1.1/parameters"

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

$CurlArgument = '-X', 'PATCH',
                $URL1,
                '-H', 
                $AuthBearer,
                '-H', 'Content-Type: application/json',
                '-H', 'cache-control: no-cache',
                '-d', 
                (($Body | ConvertTo-Json) -replace '"', '"')

& $CURLEXE @CurlArgument

Мой $ CurlArgument выглядит так:

-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"
                                      }
             }
}

Что возвращает эту ошибку:

{«status»: «FAILURE», «errors»: [{«code»: «5004», «name»: «Общая ошибка», «серьезность»: «3», «сообщение»: «Ошибка при работе "," details ": {" 5004 ":" Общая ошибка java.util.LinkedHashMap не может быть добавлена ​​в java.util.List "}}]}

Может ли это быть косой чертой в поле «Customer.1 / AddressLine1»? Я попробовал второй - заменил их и по-прежнему получил ту же ошибку:

(($Body | ConvertTo-Json) -replace '"', '"' -replace '/', '/')
(($Body | ConvertTo-Json) -replace '"', '"' -replace '/', ƈf')
(($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

Всего 1 ответ


Ли Daily предоставил ключевой указатель:

Для вашего формата JSON требуется массив под-объектов ( [...] ) как значение свойств data и data data.Parameters , тогда как, казалось бы, эквивалентные data.Parameters , которые вы создали в $Body имеют только один скалярный под-объект ,

Требуются две настройки вашего кода:

  • Убедитесь, что data и data data.Parameters содержат массивы :

    • Используйте , <object> для создания одноэлементного массива, содержащего <object> ; ConvertTo-Json автоматически преобразует массивы в JSON [ ... ] нотацию.
  • Используйте -Depth 4 с ConvertTo-Json чтобы обеспечить полное представление всех под-объектов в иерархии объектов.

$CURLEXE = 'C:WindowsSystem32curl.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

Есть идеи?

10000