我想在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`。
答案 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)
也许这就是你所追求的:
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)