ConvertFrom Json:无法转换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

从OData API服务返回以下JSON:

{
  "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