解析参数“--表达式属性值”时出错:无效的 JSON:需要用双引号括起来的属性名称:第 1 行第 3 列(字符 2)

问题描述 投票:0回答:4

我正在运行以下查询

aws dynamodb query `
--table-name user`
--key-condition-expression "datecreated = :d" `
--expression-attribute-values "{ ':d': { 'S': '2018-08-15' } }" --endpoint-url http://localhost:8000

dynamodb 理解双引号是什么吗?

  1. 我尝试过用双引号交换单引号。
  2. 到处使用双引号
  3. 双引号,单引号和双引号
  4. 使用斜线
  5. 完全删除单引号
amazon-web-services powershell amazon-dynamodb aws-cli
4个回答
16
投票

有两个迫在眉睫的问题:

  • '
    (单引号)在 JSON 中不是有效的字符串分隔符;你必须使用
    "
    (双引号):

  • 遗憾的是,从 v7.2 开始PowerShell 要求您

    \
    转义内部参数
    "
    字符在调用外部程序时
    即使这不应该是必要的

    • 请参阅此答案了解详细信息,包括未来潜在的(可能选择加入)修复。
    • 作为下面详细介绍的手动
      \
      转义的替代方案,您可以使用
      ie
      模块中的
      PSv3+ 
      Native
      辅助函数
      (在 PSv5+ 中,使用
      PowerShell 中的 
      Install-Module Native 安装) Gallery),它在内部补偿所有损坏的行为并允许按预期传递参数;要使用它,只需在调用前添加
      ie
      即可;例如:
      ie aws dynamodb query ...

因此,试试这个;请注意

'...'
如何用于 outer 引用(PowerShell 在幕后将其转换为双引号),这样您就无需将
"
转义为字符串内的
`"
- 请注意字符串内容然后按字面意思进行处理; 然而,在调用外部程序(例如 PowerShell 7.2 中的 \
)时,
aws
转义是始终需要的:
... --expression-attribute-values '{ \":d\": { \"S\": \"2018-08-15\" } }'

如果您确实需要 

"..." 作为外部引用

以便使用 
字符串扩展(插值),即为了嵌入变量引用和表达式,事情会变得更难看,因为您需要应用 two 类型转义: `" 首先,满足 PowerShell 的语法要求,前面加上
\
以确保生成的嵌入
"
正确传递到目标程序:
$date = [datetime]::now.ToString('yyyy-MM-dd')
... --expression-attribute-values "{ \`":d\`": { \`"S\`": \`"$date\`" } }"

A 

here-string 可以减轻痛苦,但请注意,它总是使命令多行 - 并且需要 \ - 转义仍然适用(注意

"@
,结束分隔符必须不仅要在自己的行上,而且必须位于该行的
最开始
): ... --expression-attribute-values @" { \":d\": { \"S\": \"$date\" } } "@



4
投票

aws dynamodb query --table-name mystore --key-condition-expression "clientid = :name" --expression-attribute-values '{":name":{"S":"[email protected]"}}'

这会给

为了解决这个问题,只需将命令更改为(注意

\"

aws dynamodb query --table-name mystore --key-condition-expression "clientid = :name" --expression-attribute-values '{\":name\":{\"S\":\"[email protected]\"}}'


1
投票

避免该问题的一种方法是使用临时 json 文件。

在 bash 脚本中:

attrvalues="{\":d\": {\"S\": \"$1\"}}" echo "$attrvalues" > attr-values.json

如果您提供 
2021-01-31

作为第一个输入,它将创建一个以下文件:

{
  ":d": {"S": "2021-01-31"}
}

然后在 bash 脚本中:

aws dynamodb query \ --table-name user \ --key-condition-expression "datecreated = :d" \ --expression-attribute-values file://attr-values.json \ --endpoint-url http://localhost:8000 rm attr-values.json



0
投票

我总是将对象双重转换为json,如下所示:

$cliValue = $myObjectGraph | ConvertTo-Json -Depth 9 -Compress | ConvertTo-Json -Depth 9;

这给了我这种形式的
$cliValue

"{\"ids\":[[\"94143814-c212-41b1-983f-e2d8ff589b2a\",\"My Description 1\"],[\"418a5f04-3d5a-4516-961f-6b0ab448edbb\",\"My Description 2\"], ...

© www.soinside.com 2019 - 2024. All rights reserved.