ConvertFrom-Json:传入了无效的对象,预期为':'或'}'

时间:2018-08-05 23:53:15

标签: json powershell scripting

本周早些时候,我问这个question来找到浏览文本文件目录的最佳方法,该目录包含JSON格式的日志信息,并计算每个唯一消息的数量。

我能够提供所提供的答案。但是,我现在遇到的问题是,其中一个文件的格式被ConvertFrom-JSON不喜欢。它引发错误:

  

ConvertFrom-Json:传入的无效对象,应为“:”或“}”。

最初,我以为我可以使用'erroraction -silentlycontinue'跳过该文件并继续前进(只有一行没有任何意义)。但是,似乎known issue不能与ConvertFrom-JSON一起使用,替代方法是使用Try / Catch。

我将如何使用try / catch绕过一个错误的文件?还是有另一种方法可以完全跳过该文件而不必将其从目录中删除?

这就是我开始的目的。数量不多,但是对此的一些指导会很棒。我还在线上看到了一些信息,我将在ConvertFrom-JSON之前使用gc -RawOut-string,但这给了我相同的结果。

try {
 gci -Path "path" | gc | ConvertFrom-Json | Group-Object message -NoElement
}

catch {
 write-host "can't convert file to JSON"
}

finally {

}

2 个答案:

答案 0 :(得分:4)

您必须将错误处理插入管道中。这是ForEach-Object派上用场的地方:

Get-ChildItem -Path "path" | 
    ForEach-Object -Process {
        try {
            $_ | Get-Content | ConvertFrom-Json
        } catch {
            write-host "can't convert file '$_' to JSON"
        }
    } | Group-Object message -NoElement

成功的转换将通过。

此外,考虑使用Write-Warning代替Write-Host来解决错误情况。似乎最适合这种情况,并且可以由调用者重定向或选择退出。

如果您认为这种情况比警告更严重,请考虑使用Write-Verbose,以便调用者可以选择加入。

答案 1 :(得分:2)

答案对我有用 ConvertFrom-Json cannot read my JSON

使用-Raw cmdlet的Get-Content参数,否则Get-Conten t分别读取每一行,并将其作为数组存储在变量中。

$json = Get-Content c:\temp\net\cars.json -Raw
ConvertFrom-Json $json

尝试一下,您将得到一个很好用的对象:

$cars = Get-Content c:\temp\net\cars.json -Raw | ConvertFrom-Json | Select -ExpandProperty cars