如何使用Json.NET在PowerShell中解析json?

时间:2012-12-20 08:29:27

标签: json powershell json.net

我想在PowerShell中解析JSON但我不能使用PowerShell中提供的新v3函数。我的第一个想法是加载JSON.Net程序集并使用它来解析JSON字符串,但它不能像我期望的那样工作。

我有这个JSON:

$json = "{""Name"": ""Apple"",  
           ""Price"": 3.99,  
            ""Sizes"": [    
                 ""Small"",    
                 ""Medium"",
                 ""Large""]}"

我使用以下代码加载JSON.NET程序集:

[Reflection.Assembly]::LoadFile("$currentPath\Newtonsoft.Json.dll”)

尝试用

解析它
$result = [Newtonsoft.Json.JsonConvert]::DeserializeObject($json)

现在我希望$result["Name"]Apple,但我什么都没得到。有什么想法吗?

代码'$ result.ContainsKey(“Name”)returns True but $ result.GetValue(“Name”)returns null`。

4 个答案:

答案 0 :(得分:12)

好的,所以这就是我如何做到这一点所以它至少适用于Windows 2008上的PowerShell v2。

首先,为您想要使用的版本加载Json.NET程序集,我使用了.NET 3.5版本:

[Reflection.Assembly]::LoadFile("Newtonsoft.Json.dll")

我在文件中使用了JSON,因为它是在我编写的部署配置中使用的,所以我需要读取文件然后解析json

$json = (Get-Content $FileName | Out-String) # read file
$config = [Newtonsoft.Json.Linq.JObject]::Parse($json) # parse string

现在要从配置中获取值,您需要使用似乎由PowerShell在哈希表/字典上定义的Item方法。因此,要获得一个简单字符串的项目,您可以编写:

Write-Host $config.Item("SomeStringKeyInJson").ToString()

如果您有一系列事情,则需要执行类似

的操作
$config.Item("SomeKeyToAnArray") | ForEach-Object { Write-Host $_.Item("SomeKeyInArrayItem").ToString() }

访问您编写的嵌套项目

$config.Item("SomeItem").Item("NestedItem")

这就是我在PowerShell中用Json.NET解析JSON的方法。

答案 1 :(得分:5)

也许这就是你所追求的:

http://poshcode.org/2930

    function Convert-JsonToXml {
PARAM([Parameter(ValueFromPipeline=$true)][string[]]$json)
BEGIN { 
   $mStream = New-Object System.IO.MemoryStream 
}
PROCESS {
   $json | Write-Stream -Stream $mStream
}
END {
   $mStream.Position = 0
   try
   {
      $jsonReader = [System.Runtime.Serialization.Json.JsonReaderWriterFactory]::CreateJsonReader($mStream,[System.Xml.XmlDictionaryReaderQuotas]::Max)
      $xml = New-Object Xml.XmlDocument
      $xml.Load($jsonReader)
      $xml
   }
   finally
   {
      $jsonReader.Close()
      $mStream.Dispose()
   }
}
}

function Write-Stream {
PARAM(
   [Parameter(Position=0)]$stream,
   [Parameter(ValueFromPipeline=$true)]$string
)
PROCESS {
  $bytes = $utf8.GetBytes($string)
  $stream.Write( $bytes, 0, $bytes.Length )
}  
}



$json = '{
    "Name": "Apple",
    "Expiry": 1230422400000,
    "Price": 3.99,
    "Sizes": [
        "Small",
        "Medium",
        "Large"
    ]
}'

Add-Type -AssemblyName System.ServiceModel.Web, System.Runtime.Serialization
$utf8 = [System.Text.Encoding]::UTF8                 
(convert-jsonToXml $json).innerXML

输出:

<root type="object"><Name type="string">Apple</Name><Expiry type="number">1230422
400000</Expiry><Price type="number">3.99</Price><Sizes type="array"><item type="s
tring">Small</item><item type="string">Medium</item><item type="string">Large</it
em></Sizes></root>

如果您想要名称节点:

$j=(convert-jsonToXml $json)
$j.SelectNodes("/root/Name")

$j |Select-Xml -XPath "/root/Name" |select -ExpandProperty node

答案 2 :(得分:0)

也许这个powershell json解析器也可以提供帮助 https://github.com/mori-b/Powershell-Json

答案 3 :(得分:0)

如果您来到这里并使用Powershell 5.0,则可以在powershell gallery

中找到它。
Install-Module Newtonsoft.Json
Import-Module Newtonsoft.Json

$json = '{"test":1}'
[Newtonsoft.Json.Linq.JObject]::Parse($json)