@@ -19,6 +19,8 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
1919 let accumulator = "" ;
2020 let innerTabs = 0 ;
2121 let parent = "" ;
22+ let globallySeenTypeNames = [ ] ;
23+ let previousParents = "" ;
2224
2325 try
2426 {
@@ -128,7 +130,7 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
128130 struct [ keyname ] = elem . value ;
129131 omitempty [ keyname ] = elem . count != scopeLength ;
130132 }
131- parseStruct ( depth + 1 , innerTabs , struct , omitempty ) ; // finally parse the struct !!
133+ parseStruct ( depth + 1 , innerTabs , struct , omitempty , previousParents ) ; // finally parse the struct !!
132134 }
133135 else if ( sliceType == "slice" ) {
134136 parseScope ( scope [ 0 ] , depth )
@@ -151,7 +153,7 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
151153 append ( parent )
152154 }
153155 }
154- parseStruct ( depth + 1 , innerTabs , scope ) ;
156+ parseStruct ( depth + 1 , innerTabs , scope , false , previousParents ) ;
155157 }
156158 }
157159 else {
@@ -164,7 +166,7 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
164166 }
165167 }
166168
167- function parseStruct ( depth , innerTabs , scope , omitempty )
169+ function parseStruct ( depth , innerTabs , scope , omitempty , oldParents )
168170 {
169171 if ( flatten ) {
170172 stack . push (
@@ -193,12 +195,20 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
193195 appender ( `${ parentType } struct {\n` ) ;
194196 ++ innerTabs ;
195197 const keys = Object . keys ( scope ) ;
198+ previousParents = parent
196199 for ( let i in keys )
197200 {
198201 const keyname = getOriginalName ( keys [ i ] ) ;
199202 indenter ( innerTabs )
200- const typename = uniqueTypeName ( format ( keyname ) , seenTypeNames )
201- seenTypeNames . push ( typename )
203+ let typename
204+ // structs will be defined on the top level of the go file, so they need to be globally unique
205+ if ( typeof scope [ keys [ i ] ] === "object" && scope [ keys [ i ] ] !== null ) {
206+ typename = uniqueTypeName ( format ( keyname ) , globallySeenTypeNames , previousParents )
207+ globallySeenTypeNames . push ( typename )
208+ } else {
209+ typename = uniqueTypeName ( format ( keyname ) , seenTypeNames )
210+ seenTypeNames . push ( typename )
211+ }
202212
203213 appender ( typename + " " ) ;
204214 parent = typename
@@ -212,18 +222,28 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
212222 }
213223 indenter ( -- innerTabs ) ;
214224 appender ( "}" ) ;
225+ previousParents = oldParents ;
215226 }
216227 else
217228 {
218229 append ( "struct {\n" ) ;
219230 ++ tabs ;
220231 const keys = Object . keys ( scope ) ;
232+ previousParents = parent
221233 for ( let i in keys )
222234 {
223235 const keyname = getOriginalName ( keys [ i ] ) ;
224236 indent ( tabs ) ;
225- const typename = uniqueTypeName ( format ( keyname ) , seenTypeNames )
226- seenTypeNames . push ( typename )
237+ let typename
238+ // structs will be defined on the top level of the go file, so they need to be globally unique
239+ if ( typeof scope [ keys [ i ] ] === "object" && scope [ keys [ i ] ] !== null ) {
240+ typename = uniqueTypeName ( format ( keyname ) , globallySeenTypeNames , previousParents )
241+ globallySeenTypeNames . push ( typename )
242+ } else {
243+ typename = uniqueTypeName ( format ( keyname ) , seenTypeNames )
244+ seenTypeNames . push ( typename )
245+ }
246+
227247 append ( typename + " " ) ;
228248 parent = typename
229249 parseScope ( scope [ keys [ i ] ] , depth ) ;
@@ -240,6 +260,7 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
240260 }
241261 indent ( -- tabs ) ;
242262 append ( "}" ) ;
263+ previousParents = oldParents ;
243264 }
244265 if ( flatten )
245266 accumulator += stack . pop ( ) ;
@@ -269,11 +290,19 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
269290
270291 // Generate a unique name to avoid duplicate struct field names.
271292 // This function appends a number at the end of the field name.
272- function uniqueTypeName ( name , seen ) {
293+ function uniqueTypeName ( name , seen , prefix = null ) {
273294 if ( seen . indexOf ( name ) === - 1 ) {
274295 return name ;
275296 }
276297
298+ // check if we can get a unique name by prefixing it
299+ if ( prefix ) {
300+ name = prefix + name
301+ if ( seen . indexOf ( name ) === - 1 ) {
302+ return name ;
303+ }
304+ }
305+
277306 let i = 0 ;
278307 while ( true ) {
279308 let newName = name + i . toString ( ) ;
0 commit comments