JSON.parse(): SyntaxError: Unexpected token � in JSON at position 0

JSON.parse(): SyntaxError: Unexpected token � in JSON at position 0

我有一个 json 对象,它 returns 来自以下 PowerShell 命令:

Get-Service -Name "name" | ConvertTo-Json -Compress > "/to/path/name.json"

如果我基本上在 vscode 中打开文件,它似乎格式正确。 在我用

读取文件后

fs.readFile(file, 'utf8', (err, data)...

然后尝试 JSON.parse(data) 我收到错误消息:

undefined:1
��{
^

SyntaxError: Unexpected token � in JSON at position 0

然后我尝试执行以下操作: data.replace(/[^\x00-\x7F]/g, "") 只包含 ASCII 字符,这基本上似乎至少与 console.log() 一起工作。

但是 JSON.parse 然后抱怨:

undefined:1
{
 

SyntaxError: Unexpected token  in JSON at position 1

我不确定那里有什么问题。希望有人可以帮助我。

这是一个示例 json 文件:因为我认为格式是正确的。 -Compress PowerShell 参数删除的空格太多。

{
    "CanPauseAndContinue":  false,
    "CanShutdown":  false,
    "CanStop":  false,
    "DisplayName":  "OpenSSH Authentication Agent",
    "DependentServices":  [

                          ],
    "MachineName":  ".",
    "ServiceName":  "ssh-agent",
    "ServicesDependedOn":  [

                           ],
    "ServiceHandle":  {
                          "IsInvalid":  false,
                          "IsClosed":  false
                      },
    "Status":  1,
    "ServiceType":  16,
    "StartType":  4,
    "Site":  null,
    "Container":  null,
    "Name":  "ssh-agent",
    "RequiredServices":  [

                         ]
}

我认为出现了换行符和制表符问题。我尝试解析您的代码,并且解析成功。请尽量使您的 JSON 数据成为一行。喜欢这里:How to remove all line breaks from a string.

您的 JSON 文件似乎有不同的编码,可能是 utf16le 而不是 utf8。

我复制了你的场景并在这里找到了帮助: Strange unicode characters when reading in file in node.js app

fs.readFile(file, 'utf16le', (err, data)...

这可能与您编写使用 session 对象的 PHP 脚本时的问题相同。

在PHP中,当一个文件使用带BOM的UTF8编码时,使用session的PHP脚本完全崩溃。为了解决这个问题,我通常在 Notepad++ 中打开文件,转到格式 -> UTF8(无 BOM),然后再次保存。总是为我工作。这可能是你的情况,因为这些损坏的字符似乎在你的文件的开头,这正是 BOM 所在的位置。

This answer might clarify about UTF8 and BOM.

通常错误消息中包含一些奇怪的字符(如 �)会提示编码可能存在问题。

一些 nodejs readFile api 具有不同的编码

fs.readFile(file, 'utf8', function(err, data) { ... });

fs.readFile(file, 'utf16le', function(err, data) { ... }); // le - little endian

fs.readFile(file, 'ucs2', function(err, data) { ... });   // kind  of 'utf16le'