Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
ConvertFrom Json:传入的对象无效,';:';或';}';预期_Json_Powershell_Scripting - Fatal编程技术网

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

ConvertFrom Json:传入的对象无效,';:';或';}';预期,json,powershell,scripting,Json,Powershell,Scripting,本周早些时候,我问这个问题是为了找到最好的方法来浏览包含JSON格式日志信息的文本文件目录,并计算每个唯一消息的数量 我能够用提供的答案做到这一点。然而,我现在遇到的问题是,其中一个文件的格式是ConvertFrom JSON不喜欢的。它抛出错误: ConvertFrom Json:传入的对象无效,应为“:”或“}” 起初,我认为可以使用“erroraction-silentlycontinue”跳过该文件并继续(只有一行没有任何意义)。然而,这似乎是一个错误,它不适用于convertfromj

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

我能够用提供的答案做到这一点。然而,我现在遇到的问题是,其中一个文件的格式是ConvertFrom JSON不喜欢的。它抛出错误:

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

起初,我认为可以使用“erroraction-silentlycontinue”跳过该文件并继续(只有一行没有任何意义)。然而,这似乎是一个错误,它不适用于convertfromjson,另一种选择是使用Try/Catch

如何使用try/catch绕过一个坏文件?或者有没有其他方法可以在不从目录中删除的情况下完全跳过此文件

以下是我开始的内容。虽然不多,但提供一些指导会很好。我也在网上看到了一些信息,在从JSON转换之前,我会使用
gc-Raw
Out-string
,但这给了我同样的结果

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

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

finally {

}

您必须将错误处理插入管道。这就是我们将派上用场的地方:

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
成功的转换将通过

另外,考虑使用<代码>写警告< /代码>而不是<代码>写主机< /C> >为您的错误条件。它似乎最适合这种情况,并且可以由调用程序重定向或选择退出

如果你认为这个条件比警告更严重,请考虑<代码>写冗长的< /代码>,这样调用方可以选择加入。

这个答案对我起作用。

使用
Get Content
cmdlet的
-Raw
参数,否则
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

@LotPings是真的,我认为这是一个足够小的更改,可以放入代码中,所以我在中编辑了它。关于分组,你是对的,所以我把它放在循环的外部。谢谢