ConvertFrom Json:无法转换Json字符串,因为从该字符串转换的字典包含重复的键
从OData API服务返回以下JSON:ConvertFrom Json:无法转换Json字符串,因为从该字符串转换的字典包含重复的键,json,rest,powershell,Json,Rest,Powershell,从OData API服务返回以下JSON: { "d": { "results": [ { "FileSystemObjectType": 0, "Id": 1, "ContentTypeId": "0x0100BC97B2F575CB0C42B79549F3BABD32A8", "Title": "Nokia California", "Address": "200 South Matild
{
"d": {
"results": [
{
"FileSystemObjectType": 0,
"Id": 1,
"ContentTypeId": "0x0100BC97B2F575CB0C42B79549F3BABD32A8",
"Title": "Nokia California",
"Address": "200 South Matilda Avenue\nW Washington Ave\n94086 Sunnyvale, California\nUnited States of America",
"ID": 1,
"Modified": "2014-02-24T10:06:39Z",
"Created": "2014-02-24T10:06:39Z",
"AuthorId": 12,
"EditorId": 12,
"OData__UIVersionString": "1.0",
"Attachments": false,
"GUID": "d12aafad-502a-4968-a69e-36a7ea05ec80"
}
]
}
}
并作为字符串保存到名为$data
尝试使用cmdlet将JSON格式的字符串转换为自定义对象:
给出以下错误:
ConvertFrom Json:无法转换Json字符串,因为存在字典
从包含重复键“Id”的字符串转换而来的
和“ID”
是否有任何方法可以在PowerShell中转换指定的JSON格式的字符串?ConvertFrom JSON它将尝试从JSON字符串创建PS自定义对象。PowerShell对象属性名称不区分大小写,因此“ID”和“ID”表示相同的属性名称。在进行转换之前,您必须先处理JSON中重复的属性名,否则转换将失败。在PowerShell V1.0或PowerShell V2.0中,当JSON太大时,我仍然使用转换为XML:
Add-Type -AssemblyName System.ServiceModel.Web, System.Runtime.Serialization
function Convert-JsonToXml
{
PARAM([Parameter(ValueFromPipeline=$true)][string[]]$json)
BEGIN
{
$mStream = New-Object System.IO.MemoryStream
}
PROCESS
{
$json | Write-String -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()
}
}
}
使用此代码,您可以循环通过您可以测试的项目:
$a = Get-Content C:\temp\jsontest.txt
$b.root.d.results.Item
$b.root.d.results.Item[7].Id[0].InnerText
(编辑) 在您的情况下,我将只替换预期的重复ID/ID
$data = Get-Content C:\temp\jsontest.txt -Raw
$datacorrected = $a -creplace '"Id":','"Id-minus":'
$psJsonIn = $datacorrected | ConvertFrom-Json
如果您确实遇到了意外的重复项,您可以编写一个函数来捕获由于重复项导致的转换错误并替换一个。我就是这样处理它的:
$results = $data.ToString().Replace("ID", "_ID") | ConvertFrom-Json
谢谢所以,您建议我将JSON格式的字符串转换为Xml,对吗?但我想坚持使用JSON,也许可以通过某种方式过滤JSON字符串以排除重复的键(在我的例子中是ID,ID)?@Vadim Gremyachev,我在第二个回合左右编辑我的答案(不是更好)。我更喜欢这样,但我建议做一个小小的修改:$results=$data.ToString().Replace(““ID”“,”u ID“)| ConvertFrom Json将只针对“ID”(如果是整个属性名,则会出现在属性名中),但避免修改选择的任何其他属性,其中“ID”仅显示为名称的一部分。例如,避免将“液体体积”更改为“液体体积”。
$results = $data.ToString().Replace("ID", "_ID") | ConvertFrom-Json