【问题标题】:ConvertFrom-Json : Invalid object passed in, ':' or '}' expectedConvertFrom-Json : 传入的对象无效,应为 ':' 或 '}'
【发布时间】:2019-01-12 21:52:36
【问题描述】:

本周早些时候,我向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 {

}

【问题讨论】:

    标签: json powershell scripting


    【解决方案1】:

    您必须将错误处理插入到管道中。这就是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,以便调用者可以选择加入。

    【讨论】:

    • @LotPings 是的,这是一个足够小的更改,可以放入我认为的代码,所以我编辑了它。你对分组是正确的,所以我把它放在外面循环。谢谢!
    【解决方案2】:

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

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

    $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
    

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 1970-01-01
      • 2017-07-21
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多