在Json文件中格式化Json对象值

时间:2014-07-07 21:52:43

标签: javascript json powershell

我开发了一个powershell脚本,它生成一个JSON文件,尝试使用JQuery进行解析。

  

var mydata = jQuery.parseJSON(w3wp);

 w3wp = '[{"Pid" : "6724" , "Apppool" : "myapppool1" , "Usage" : "229.328125"},{"Pid" : "6808" , "Apppool" : "myapppool2" , "Usage" : "152" }]';

当JSON数据在上面的单行中时没有发现问题,脚本运行正常。 如果json数据的格式如下所示,我在w3wp中得到了未定义的错误。"

 w3wp = '[{"Pid" : "6724" , "Apppool" : "myapppool1" , "Usage" : "229.328125"},
 {"Pid" : "6808" , "Apppool" : "myapppool2" , "Usage" : "152" }]';

上面的表示实时场景中的数据非常少,应用程序池的数量很大,而且power-shell字包装在2.0中,并且我遇到了JSON文件的问题。有没有办法格式化这个Json文件,所以我可以使用它来解析?

根据请求,这里是powershell脚本

$host.UI.RawUI.BufferSize = new-object System.Management.Automation.Host.Size 5512,100
function get-apppool {
    [regex]$pattern="-ap ""(.+)"""
    $contentx="w3wp = '["
    gwmi win32_process -filter 'name="w3wp.exe"' | % {
        $name=$_.name
        $cmd = $pattern.Match($_.commandline).Groups[1].Value
        $procid = $_.ProcessId
        $cpuper = get-process | where-object {$_.id -like $procid} | select -Expand CPU
        $contentx = $contentx + "{""Pid"" : ""$procid"" , ""Apppool"" : ""$cmd"" , ""Usage"" : ""$cpuper"" }"
        $contentx = $contentx + ","
    }
    $contentx = $contentx -replace ".$"
    $contentx = $contentx + "]';"
    write-host -nonewline $contentx > dsdf.json 
} 
get-apppool

3 个答案:

答案 0 :(得分:3)

您不必自己构建Json,让PowerShell为您执行此操作 - 至少在V3及更高版本中具有方便的ConvertTo-Json命令,例如:

Get-WmiObject Win32_Process -Filter 'name="w3wp.exe"' | 
    Where {$_.commandline -match '-ap "(.*)"'} | 
    Select @{n='Pid';e={$_.ProcessId}},
           @{n='AppPool';e={$_.matches[1]}},
           @{n='Usage';e={[float](Get-Process -id $_.ProcessId).CPU}} | 
    ConvertTo-Json > dsdf.json

答案 1 :(得分:1)

假设您没有使用V3(您说您使用的是2.0),我可以建议以下内容(我无法确认这一点,因为您尚未发布脚本的输出):

反引号:

如果您想在字符串中添加单引号和双引号,建议您始终使用backticks,例如:

$contentx="w3wp = `'["

JSON格式错误:

您在每个数组对象后面添加一个逗号(,),如果您不删除它,它将生成undefined error in w3wp,您可以通过在完成之前删除它的最后一个逗号来更正此错误像这样的JSON字符串:

$contentx = $contentx.Substring(0,$contentx.Lenght-1);
$contentx = $contentx + "]`';"

写主机没有达到您的期望:

好,如CB's answer中所述:

  

Write-host仅将输出重定向到控制台。

您可以改为使用write-output $contentx > dsdf.json

其他可能的错误:

您从文件加载数据的方式也存在问题,但我现在没有足够的信息来评估它。

答案 2 :(得分:0)

JSON.Stringfy为我解决了问题,现在我能够从JSON文件中正确解析字符串。问题是由于开头和结尾的单引号引起了JSON解析的问题。我运行JSON.Stringfy,然后将其传递给JSON.Parse,修复了问题。感谢您的意见和建议。