Skip to content

Commit 6270cab

Browse files
Fix nested PSCustomObjects in hashtables
This change properly unwraps only PSCustomObjects in hash tables before serializing, leaving PScustomObjects to the root serializer for further processing. Signed-off-by: Gabriel Adrian Samfira <[email protected]>
1 parent f0da96d commit 6270cab

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed

Tests/powershell-yaml.Tests.ps1

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,9 +725,17 @@ int64: 9223372036854775807
725725
$nestedPsO = [PSCustomObject]@{
726726
Nested = 'NestedValue'
727727
}
728+
$nestedHashTable = @{
729+
"aKey" = $nestedPsO
730+
}
731+
$nestedArray = @(
732+
$nestedPsO
733+
)
728734
$PsO = [PSCustomObject]@{
729735
Name = 'Value'
730736
Nested = $nestedPsO
737+
NestedHashTable = $nestedHashTable
738+
NestedArray = $nestedArray
731739
NullValue = $null
732740
}
733741

@@ -746,6 +754,16 @@ int64: 9223372036854775807
746754
$ret["PsO"]["Name"] = "Value"
747755
$ret["PsO"]["Nested"] = [System.Collections.Specialized.OrderedDictionary]::new()
748756
$ret["PsO"]["Nested"]["Nested"] = "NestedValue"
757+
$ret["PsO"]["NestedHashTable"] = [ordered]@{
758+
"aKey" = [ordered]@{
759+
"Nested" = "NestedValue"
760+
}
761+
}
762+
$ret["PsO"]["NestedArray"] = @(
763+
[ordered]@{
764+
"Nested" = "NestedValue"
765+
}
766+
)
749767
$ret["PsO"]["NullValue"] = $null
750768
$ret["Ok"] = "aye"
751769
Assert-Equivalent -Options $compareStrictly -Expected $ret -Actual $result
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

src/PowerShellYamlSerializer.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,15 @@ public void WriteYaml(IEmitter emitter, object value, Type type, ObjectSerialize
8484
continue;
8585
}
8686
serializer(entry.Key, entry.Key.GetType());
87+
var objType = entry.Value.GetType();
88+
var val = entry.Value;
8789
if (entry.Value is PSObject nestedObj) {
88-
serializer(nestedObj.BaseObject, nestedObj.BaseObject.GetType());
90+
var nestedType = nestedObj.BaseObject.GetType();
91+
if (nestedType != typeof(System.Management.Automation.PSCustomObject)) {
92+
objType = nestedObj.BaseObject.GetType();
93+
val = nestedObj.BaseObject;
94+
}
95+
serializer(val, objType);
8996
} else {
9097
serializer(entry.Value, entry.Value.GetType());
9198
}

0 commit comments

Comments
 (0)