解析chef-client的JSON文件时出现词法错误

时间:2018-03-25 12:26:34

标签: json powershell chef

我使用powershell创建一个JSON文件,并使用JSON文件作为chef-runtime属性。

创建JSON文件的代码(在powershell中)

New-Item $ATTRIBUTESFILE -ItemType file
$jsonInput = @{param1=@{subparam=$attribute}}
$ATTRIBUTE = $jsonInput | ConvertTo-Json
$ATTRIBUTE | Out-File $ATTRIBUTESFILE

致电厨师客户的代码

chef-client -o 'recipe[cookbook]' -j $ATTRIBUTESFILE

错误消息

c:/chef/embedded/lib/ruby/gems/1.9.1/gems/yajl-ruby-1.1.0-x86-mingw32/lib/yajl.rb:36:in `parse': lexical error:
invalid char in json text. (Yajl::ParseError)
                                   ÿ_{                     (right here) ------^
    from c:/chef/embedded/lib/ruby/gems/1.9.1/gems/yajl-ruby-1.1.0-x86-mingw32/lib/yajl.rb:36:in `parse'
    from c:/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/json_compat.rb:56:in `from_json'

当我手动创建相同的文件时,它不会出现词汇错误。 任何有关这方面的帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

Add -Encoding UTF8 to the Out-File. That's probably a UTF-16 byte order mark.

答案 1 :(得分:1)

默认情况下,Windows PowerShell会创建带有Out-File>的UTF-16LE编码文件(带有BOM)。 [1]

相比之下,根据coderanger,Chef需要没有BOM的UTF-8编码文件。 不幸的是,使用-Encoding UTF8总是在Windows PowerShell中使用 BOM创建UTF-8文件。解决方案是直接使用.NET框架:

[System.IO.File]::WriteAllText($ATTRIBUTESFILE.FullName, $ATTRIBUTE)

请参阅我的this answer以获得便利功能,该功能可生成无BOM的UTF-8文件,其语法类似于Out-File

[1]在PowerShell Core 中,没有BOM的UTF-8现在是默认编码。