Как правильно отформатировать JSON в Powershell при использовании aws-cli? - PullRequest
0 голосов
/ 18 июня 2019

Ошибка отправки структуры JSON с использованием aws-cli в Powershell.В частности, вызов для помещения элемента в существующую таблицу DynamoDB.

Кажется, что проблема в том, что не хватает двойных кавычек вокруг ключей и значений в объекте JSON, который я пытаюсь отправить.Я читал, что Powershell привередлив в выводе двойных кавычек, особенно при использовании внешних API.

К сожалению, поскольку моя организация использует okta для аутентификации запросов AWS, я должен использовать Powershell.

Я перепробовал все, что видел здесь:

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-json?view=powershell-6

... здесь:

Ошибка анализа параметра '--expression-attribute-values': неверный JSON: ожидаемое имя свойства заключено в двойные кавычки: строка 1, столбец 3 (char 2)

... здесь:

https://github.com/aws/aws-cli/issues/1326

... и здесь:

PowerShell: лучшийспособ избежать двойных кавычек в строке, переданной внешней программе?Например, строка JSON

ЧТО Я ПОПРОБОВАЛ:

Это основная первая попытка:

okta-aws dh dynamodb put-item --table-name AlexaRoomLookup-dev --item '{"deviceId": {"S":"amzn1.ask.device.AEH2LHYGV7GSPP5THMR
5H56AI2OOMAQ7MF54CZ3E6WR433WGS6QAOCYCKJWRJ3TQY5IE76NWR2IKCANB6TJNKLDEZOO2YN6ACUVT33MKSS4CO6R7GJI6GDFLOBOPUA2IXX7RI732UXJ6PDST5KYC7CSQK
634K4APEBRNVOKVZIDECOCBBIFB4"},"roomNumber": {"N":9110}}' --return-consumed-capacity TOTAL

Тогда япопытался экранировать с помощью обратной косой черты:

okta-aws dh dynamodb put-item --table-name AlexaRoomLookup-dev --item {\"deviceId\":{\"S\":\"amzn1.ask.device.AEH2LHYGV7GSPP5THMR5H56AI2OOMAQ7MF54CZ3E6WR433WGS6QAOCYCKJWRJ3TQY5IE76NWR2IKCANB6TJNKLDEZOO2YN6ACUVT33MKSS4CO6R7GJI6GDFLOBOPUA2IXX7RI732UXJ6PDST5KYC7CSQK634K4APEBRNVOKVZIDECOCBBIFB4\"},\"roomNumber\": {\"N\":9110}} --return-consumed-capacity TOTAL

Затем повторил операцию с помощью обратной галочки (которую я заменил здесь звездочкой, чтобы SO читал ее как код) и обратной косой черты:

{*"deviceId*": {*"S*":*"amzn1.ask.device.AEH2LHYGV7GSPP
5THMR5H56AI2OOMAQ7MF54CZ3E6WR433WGS6QAOCYCKJWRJ3TQY5IE76NWR2IKCANB6TJNKLDEZOO2YN6ACUVT33MKSS4CO6R7GJI6GDFLOBOPUA2IXX7RI732UXJ6PDST5KYC
7CSQK634K4APEBRNVOKVZIDECOCBBIFB4*"},*"roomNumber*": {*"N*":9110}}" --return- consumed-capacity TOTAL

I тогдапопробовал "здесь строку" безрезультатно.

ОЖИДАНИЯ И РЕЗУЛЬТАТЫ:

Я ожидаю, что метод экранирования, описанный в документации Microsoft, будет работать.

Каждый из вышеперечисленных выдает эту ошибку с вариацией проблемного «JSON полученный» на основе метода escape, но он никогда не имел двойных кавычек вокруг ключей и значений:

Error parsing parameter '--item': Invalid JSON: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
JSON received: {deviceId: {S:amzn1.ask.device.AEH2LHYGV7GSPP5THMR5H56AI2OOMAQ7MF54CZ3E6WR433WGS6QAOCYCKJWRJ3TQY5IE76NWR2IKCANB6TJNKLDEZOO2YN6ACUVT33MKSS4CO6R7GJI6GDFLOBOPUA2IXX7RI732UXJ6PDST5KYC7CSQK634K4APEBRNVOKVZIDECOCBBIFB4},roomNumber: {N:9110}}

Единственное, чтоКазалось, что работа использовала "file: //file.json" в качестве входных данных для --item, который я нигде не мог найти документированным ... Я думаю, что это было в том потоке github, который я связал.Тем не менее, я бы предпочел не редактировать файл каждый раз, когда я хочу отправить JSON с помощью вызова API AWS ... Вот оно:

okta-aws dh dynamodb put-item --table-name AlexaRoomLookup-dev --item file://file.json --return-consumed-capacity TOTAL

Может ли кто-нибудь предоставить информацию, отличную от того, что указано здесь какпочему вышеупомянутые методы не будут работать?Я только что реализовал их неправильно?

Спасибо.

1 Ответ

0 голосов
/ 19 июня 2019

Вы можете попробовать PowerShell «остановить анализ» (то есть «-%») в начале команды. Это заставляет PowerShell дословно использовать остальные параметры.

PS> okta-aws --% dh dynamodb put-item --table-name AlexaRoomLookup-dev --item '{"deviceId": {"S":"amzn1.ask.device.AEH...etc...FB4"},"roomNumber": {"N":9110}}' --return-consumed-capacity TOTAL

Подробнее см. about_parsing ...

Это не поможет, если ваш json находится в переменной, но если он жестко запрограммирован, как ваш пример выше, он может работать.

...