PowerShell - ConvertFrom-Json 无法正确序列化具有混合属性的 JSON 项目数组 [重复]

Posted

技术标签:

【中文标题】PowerShell - ConvertFrom-Json 无法正确序列化具有混合属性的 JSON 项目数组 [重复]【英文标题】:PowerShell - ConvertFrom-Json fails to properly serialize JSON array of items with mixed properties [duplicate] 【发布时间】:2022-01-19 02:38:30 【问题描述】:

我正在为 NoSQL 支持的数据库开发 PowerShell 客户端。并非我查询的表中的所有文档都具有完全相同的属性集。当使用 ConvertFrom-Json 序列化此负载时,第一个 JSON 数组项指示 JSON 负载中所有其他对象可用的属性。

例子:

@"
[
    
        "thing1":  "bob",
        "thing2":  "mary"
    ,
    
        "thing1":  "bob",
        "thing2":  "mary",
        "thing3":  "tom"
    
]
"@ | ConvertFrom-Json

thing1 thing2
------ ------
bob    mary
bob    mary
@"
[
    
        "thing1":  "bob",
        "thing2":  "mary",
        "thing3":  "tom"
    ,
    
        "thing1":  "bob",
        "thing2":  "mary"
    
]
"@ | ConvertFrom-Json

thing1 thing2 thing3
------ ------ ------
bob    mary   tom
bob    mary

这是预期的行为吗?除了尝试自己解析原始 JSON 之外,还有其他方法吗?

我目前使用的是 PowerShell 5.1:

$PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.18362.1801
PSEdition                      Desktop
PSCompatibleVersions           1.0, 2.0, 3.0, 4.0...
BuildVersion                   10.0.18362.1801
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

【问题讨论】:

如果您想知道的话,元素 1(索引从 0 开始)的属性 thing3 将在那里。即使您没有在控制台上看到它。 你可以尝试先存储对象再$json.foreach( $_ | Out-Host ) 您说的很对 Santiago,感谢您的快速回复。使用| select * 从对象数组中选择什么都不做,但我可以按照您的描述访问隐藏的属性。 请注意,其他 cmdlet 也可能会遇到这种情况,即:ConvertTo-CsvExport-Csv,如果您要按原样导出第一个 object[],除非您进行排序,否则您将丢失第三列它由具有最多属性的对象 => | Sort-Object $_.PSObject.Properties.Count -Descending | ConvertTo-Csv 尝试在有和没有排序的情况下进行转换:) 当应用 Format-Table 格式时,如果对象具有 4 个或更少的属性,则会隐式发生这种情况,集合中的 first 对象会根据其属性锁定所有显示列.如果后续对象具有不同的属性,则仅显示与第一个对象共享的对象;如果给定对象不共享,则显示一个空行。这只是一个显示问题,您可以通过将对象传送到... | Format-List 来验证。请参阅the linked duplicate 了解更多信息。 【参考方案1】:

这不是 ConvertFrom-Json 的问题。这与Write-Output missing columns 有关。原因是 PowerShell 默认将输出格式化为表格,并使用第一行来格式化所有行。只需观察这两个对象的显示方式即可。

[PSCustomObject]@
    a=1;
 
[PSCustomObject]@
    a=2;b=3;

尝试将输出格式化为列表而不是表格,以查看 ConvertFrom-Json 不会丢失列。

$json | ConvertFrom-Json|Format-List

【讨论】:

以上是关于PowerShell - ConvertFrom-Json 无法正确序列化具有混合属性的 JSON 项目数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell - 一个与 convertfrom-string 相关的奇怪问题

PowerShell - ConvertFrom-Json 无法正确序列化具有混合属性的 JSON 项目数组 [重复]

PowerShell 脚本中调用密文密码

ConvertFrom-Json:无效的JSON原语

PowerShell 抓取网页表格

PowerShell:按字段值检索JSON对象