powershell 分析参数“--expression-attribute-values”时出错:无效的JSON:应将属性名称括在双引号中:第1行第3列(字符2)

ff29svar  于 12个月前  发布在  Shell
关注(0)|答案(4)|浏览(138)

我正在运行以下查询

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.我试过用双引号交换单引号。
1.到处使用双引号
1.将单引号和双引号加倍
1.使用斜杠
1.完全删除单引号

z0qdvdin

z0qdvdin1#

有两个迫在眉睫的问题:

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

  • 遗憾的是,从v7.2开始,PowerShell要求您在调用外部程序时 使用\-转义参数-内部"字符 即使不需要 *。
  • 请参阅this answer以了解详细信息,包括未来可能的(可能是选择性加入)修复。
  • 作为下面详细介绍的手动\转义的替代方法,您可以使用**Native module中的PSv 3 + ie helper函数**(在PSv 5+中,使用PowerShell Gallery中的Install-Module Native进行安装),它在内部补偿所有中断的行为,并允许按预期传递参数;要使用它,只需将ie添加到您的调用前面即可;例如:

ie aws dynamodb query ...
因此,试试这个;注意如何将**'...'用于 * 外 * 引号**(PowerShell在后台将其转换为双引号),以便不必将"转义为字符串内的``"--请注意,字符串内容随后将被 * 照字面意义 * 处理; 但是,在PowerShell 7.2中调用外部程序(如aws)时,* 始终 * 需要`-转义:

... --expression-attribute-values '{ \":d\": { \"S\": \"2018-08-15\" } }'

字符串
如果确实需要**"..."作为外引号以便使用字符串扩展**(插值),也就是说,为了嵌入变量引用和表达式,事情变得更糟糕,因为您需要应用 * 两种 * 转义:首先是``",以满足PowerShell的语法要求,然后是`,以确保生成的嵌入式"正确地传递到目标程序:

$date = [datetime]::now.ToString('yyyy-MM-dd')
... --expression-attribute-values "{ \`":d\`": { \`"S\`": \`"$date\`" } }"


here-string可以减轻这种痛苦,但请注意,它总是会使命令 * 多行 * -而且对\的需要-转义仍然适用(请注意,"@,结束分隔符不仅必须在它自己的行上,而且必须在该行的 * 最开始 *):

... --expression-attribute-values @"
  { \":d\": { \"S\": \"$date\" } }
"@

vxqlmq5t

vxqlmq5t2#

我刚才在使用Key-Condition-Expression参数时遇到了同样的问题

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

字符串
这将给予
x1c 0d1x的数据
为了解决这个问题,就只好把命令改为(注意\"

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


6mzjoqzu

6mzjoqzu3#

当我想创建一个接受参数的bash脚本时,我遇到了这个问题,这样我就可以用各种输入进行查询。
避免这个问题的一个方法是使用临时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

kkih6yb8

kkih6yb84#

令人沮丧的是,这并没有更简单地工作。
我总是将对象双重转换为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\"], ...

相关问题