Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分析chef客户端的JSON文件时出现词法错误_Json_Powershell_Chef Infra - Fatal编程技术网

分析chef客户端的JSON文件时出现词法错误

分析chef客户端的JSON文件时出现词法错误,json,powershell,chef-infra,Json,Powershell,Chef Infra,我正在使用powershell创建一个JSON文件,并将JSON文件用作chef运行时属性 创建JSON文件的代码(在powershell中) 调用chef客户端的代码 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 e

我正在使用powershell创建一个JSON文件,并将JSON文件用作chef运行时属性

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

调用chef客户端的代码

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'
当我手动创建同一个文件时,它不会给出任何词法错误。
如果您对此有任何帮助,我们将不胜感激。

-Encoding UTF8
添加到
输出文件
。这可能是一个UTF-16字节的顺序标记。

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

相比之下,Chef需要UTF-8编码的文件,而不需要BOM。 不幸的是,使用
-编码UTF8
总是在Windows PowerShell中创建带有BOM表的UTF-8文件。解决方案是直接使用.NET framework:

[System.IO.File]::WriteAllText($ATTRIBUTESFILE.FullName, $ATTRIBUTE)
有关生成无BOM UTF-8文件的便利函数,请参见我的一篇文章,该文件的语法类似于
Out File



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

事实上,
Out File
默认创建一个UTF-16LE文件(带BOM)(与
一样);请注意,使用
-编码UTF-8
也会创建BOM,但是-Chef可以处理吗?不,我们假设到处都是正常的文件处理。还有为什么UTF-8需要BOM?Unicode标准既不鼓励也不鼓励UTF-8 BOM(更恰当地称为Unicode签名)。在Unix世界中,大多数实用程序在编写UTF-8文件时既不生成BOM表,也不知道在读取文件时如何处理BOM表。不幸的是,在Windows世界中,为了向后兼容,通常使用BOM表:没有BOM表的文件继续被解释为“ANSI”编码。幸运的是,PowerShell的跨平台核心版已经看到了曙光,现在也默认使用无BOM的UTF-8。@Ayush:我的荣幸;很高兴这有帮助。重新打字:哎呀!修好了,谢谢。
[System.IO.File]::WriteAllText($ATTRIBUTESFILE.FullName, $ATTRIBUTE)