@@ -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