@@ -19,6 +19,7 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
19
19
let accumulator = "" ;
20
20
let innerTabs = 0 ;
21
21
let parent = "" ;
22
+ let globallySeenTypeNames = [ ] ;
22
23
23
24
try
24
25
{
@@ -197,8 +198,15 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
197
198
{
198
199
const keyname = getOriginalName ( keys [ i ] ) ;
199
200
indenter ( innerTabs )
200
- const typename = uniqueTypeName ( format ( keyname ) , seenTypeNames )
201
- seenTypeNames . push ( typename )
201
+ let typename
202
+ // structs will be defined on the top level of the go file, so they need to be globally unique
203
+ if ( typeof scope [ keys [ i ] ] === "object" && scope [ keys [ i ] ] !== null ) {
204
+ typename = uniqueTypeName ( format ( keyname ) , globallySeenTypeNames , parent )
205
+ globallySeenTypeNames . push ( typename )
206
+ } else {
207
+ typename = uniqueTypeName ( format ( keyname ) , seenTypeNames )
208
+ seenTypeNames . push ( typename )
209
+ }
202
210
203
211
appender ( typename + " " ) ;
204
212
parent = typename
@@ -222,8 +230,16 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
222
230
{
223
231
const keyname = getOriginalName ( keys [ i ] ) ;
224
232
indent ( tabs ) ;
225
- const typename = uniqueTypeName ( format ( keyname ) , seenTypeNames )
226
- seenTypeNames . push ( typename )
233
+ let typename
234
+ // structs will be defined on the top level of the go file, so they need to be globally unique
235
+ if ( typeof scope [ keys [ i ] ] === "object" && scope [ keys [ i ] ] !== null ) {
236
+ typename = uniqueTypeName ( format ( keyname ) , globallySeenTypeNames , parent )
237
+ globallySeenTypeNames . push ( typename )
238
+ } else {
239
+ typename = uniqueTypeName ( format ( keyname ) , seenTypeNames )
240
+ seenTypeNames . push ( typename )
241
+ }
242
+
227
243
append ( typename + " " ) ;
228
244
parent = typename
229
245
parseScope ( scope [ keys [ i ] ] , depth ) ;
@@ -269,11 +285,19 @@ function jsonToGo(json, typename, flatten = true, example = false, allOmitempty
269
285
270
286
// Generate a unique name to avoid duplicate struct field names.
271
287
// This function appends a number at the end of the field name.
272
- function uniqueTypeName ( name , seen ) {
288
+ function uniqueTypeName ( name , seen , prefix = null ) {
273
289
if ( seen . indexOf ( name ) === - 1 ) {
274
290
return name ;
275
291
}
276
292
293
+ // check if we can get a unique name by prefixing it
294
+ if ( prefix ) {
295
+ name = prefix + name
296
+ if ( seen . indexOf ( name ) === - 1 ) {
297
+ return name ;
298
+ }
299
+ }
300
+
277
301
let i = 0 ;
278
302
while ( true ) {
279
303
let newName = name + i . toString ( ) ;
0 commit comments