【问题标题】:Formatting Json Object values in Json File在 Json 文件中格式化 Json 对象值
【发布时间】:2014-08-28 12:31:10
【问题描述】:

我开发了一个 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" }]';

上面的表示是实时场景中的数据非常少,应用程序池的数量很大,并且在 2.0 中使用 power-shell 自动换行并且 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

【问题讨论】:

  • 它是回车的问题吗?
  • 我不确定,我正在寻找一种将这些分成多行的方法
  • 嗯,。尽管使用了 System.Management.Automation.Host.Size,但我无法在 powershell 中打印单行,但该值仍然会变形,并且输出文件有多行无法解析。如果有办法拆分这些,那么我会在 powershell 中实现这个逻辑来格式化 JSON 文件。
  • 你的代码没有意义......嵌套script标签?并且通过标题为“text/javascript”的脚本标签引用 JSON 文件是错误的形式。应该是<script type="application/json" src="dfdsf.json">
  • 我该下班了,所以我要回家了,但是如果早上没有其他人有的话,我会尽快与您联系 PowerShell 脚本部分。

标签: javascript json powershell


【解决方案1】:

您不必自己构建 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

【讨论】:

    【解决方案2】:

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

    反引号:

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

    $contentx="w3wp = `'["
    

    JSON 格式错误:

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

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

    Write-host 没有按照你的预期做:

    好吧,正如CB's answer中所述:

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

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

    其他可能的错误:

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

    【讨论】:

      【解决方案3】:

      JSON.Stringfy 为我解决了这个问题,现在我可以从 JSON 文件中正确解析字符串。问题是由于开头和结尾的单引号导致 JSON 解析出现问题。我运行了 JSON.Stringfy,然后将其传递给 JSON.Parse,从而解决了这个问题。感谢您的 cmets 和建议。

      【讨论】:

        猜你喜欢
        • 2013-01-16
        • 2019-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多