关于python:Knife无法在PowerShell中解析JSON变量

关于python:Knife无法在PowerShell中解析JSON变量

我正在尝试使用“knife ec2 server create”创建一个 amazon EC2 实例,并传入 JSON 来使用 -j 选项覆盖默认设置,其中 $json 是正确格式的 JSON 文本,无论我是否引用变量,我都会收到相同的错误:

PS C:\Users\chef> knife ec2 server create --region ... -j $json

失败并出现以下错误:

C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `initialize': A JSON text must
at least contain two octets! (JSON::ParserError)
        from C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `new'
        from C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse'
        from C:/Users/chef/AppData/Local/chefdk/gem/ruby/2.1.0/gems/knife-ec2-0.12.0/lib/chef/knife/ec2_server_create.rb
:218:in `block in <class:Ec2ServerCreate>'

如果我尝试将 JSON 放在命令行上,我会收到不同的错误:

C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse': 757: unexpected token
at '{fusion_**** : *** }' (JSON::ParserError)
        from C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse'
        from C:/Users/chef/AppData/Local/chefdk/gem/ruby/2.1.0/gems/knife-ec2-0.12.0/lib/chef/knife/ec2_server_create.rb
:218:in `block in <class:Ec2ServerCreate>'
        from C:/opscode/chefdk/embedded/lib/ruby/gems/2.1.0/gems/mixlib-cli-1.5.0/lib/mixlib/cli.rb:235:in `call'

我无法找到有关 knife 和 PowerShell 的任何已知问题,尽管它可以与“{}”的最小 JSON 一起使用,但它似乎无法与其他任何东西一起使用。

有人自己做过这个工作吗?

答案1

shell 可能吃了你的引号,因为两个错误消息都显示它们不存在。

{fusion_**** : *** }不是有效的 JSON,它肯定需要用{"fusion_****" : "***"}引号括起来的键和值(假设值是一个字符串;当然,文字truefalse、 和null... 和数字值没有用引号括起来)。

我猜想需要进行如下设置......

$json = '{"fusion_****" : "***"}'

...其中单引号导致双引号被解释为文字。或者这样:

Powershell 中的文字转义字符是什么?

...但是,我对 powershell 一无所知,只是对 shell 有所了解。如果这不能帮你解决问题,也许发布你分配变量的代码会有所帮助。

答案2

我发现对于 Ruby,您需要使用反斜杠来转义 JSON 中的引号。

由于我在 PowerShell 字符串中使用了替换,因此我还使用以下代码转义了字符串中的引号:重音符号对于 PowerShell。

例如,以 JSON 格式获取此内容:

    { "fusion": "****" }

您可以像这样对 PowerShell 进行编码,使用单引号(无替换):

    $json = '{ \"fusion_****\" : \"***\" }'

或者像这样,使用双引号(启用替换,但在此示例中未使用):

    $json = "{ \`"fusion_****\`" : \`"***\`" }"

相关内容