Skip to content

Commit c450494

Browse files
committed
Fix: Expand colon-delimited keys to hierarchical structure before merging
1 parent b107cb3 commit c450494

1 file changed

Lines changed: 45 additions & 0 deletions

File tree

UserSecretsExtension/UserSecretsExtensionStartupFilter.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ internal static string MergeJsonStrings(string baseJson, string overrideJson)
8484
{
8585
var baseNode = JsonNode.Parse(baseJson);
8686
var overrideNode = JsonNode.Parse(overrideJson);
87+
88+
if (baseNode is JsonObject baseObj) ExpandColonDelimitedKeys(baseObj);
89+
if (overrideNode is JsonObject overrideObj) ExpandColonDelimitedKeys(overrideObj);
90+
8791
var mergedNode = MergeJson(baseNode, overrideNode);
8892
return mergedNode is null
8993
? "null"
@@ -93,6 +97,47 @@ internal static string MergeJsonStrings(string baseJson, string overrideJson)
9397
});
9498
}
9599

100+
private static void ExpandColonDelimitedKeys(JsonObject obj)
101+
{
102+
var colonKeys = obj
103+
.Where(kvp => kvp.Key.Contains(':'))
104+
.Select(kvp => (kvp.Key, kvp.Value))
105+
.ToArray();
106+
107+
foreach (var (key, value) in colonKeys)
108+
{
109+
obj.Remove(key);
110+
111+
var segments = key.Split(':');
112+
var current = obj;
113+
114+
for (var i = 0; i < segments.Length - 1; i++)
115+
{
116+
var segment = segments[i];
117+
if (current[segment] is JsonObject existing)
118+
{
119+
current = existing;
120+
}
121+
else
122+
{
123+
var newObj = new JsonObject();
124+
current[segment] = newObj;
125+
current = newObj;
126+
}
127+
}
128+
129+
current[segments[^1]] = value?.DeepClone();
130+
}
131+
132+
foreach (var (_, value) in obj)
133+
{
134+
if (value is JsonObject child)
135+
{
136+
ExpandColonDelimitedKeys(child);
137+
}
138+
}
139+
}
140+
96141
private static JsonNode? MergeJson(JsonNode? baseNode, JsonNode? overrideNode)
97142
{
98143
if (overrideNode is null) return null;

0 commit comments

Comments
 (0)