@@ -42,8 +42,9 @@ function jsonToGo(json, typename)
4242 {
4343 if ( Array . isArray ( scope ) )
4444 {
45- var sliceType ;
46- for ( var i = 0 ; i < scope . length ; i ++ )
45+ var sliceType , scopeLength = scope . length ;
46+
47+ for ( var i = 0 ; i < scopeLength ; i ++ )
4748 {
4849 var thisType = goType ( scope [ i ] ) ;
4950 if ( ! sliceType )
@@ -55,33 +56,77 @@ function jsonToGo(json, typename)
5556 break ;
5657 }
5758 }
59+
5860 append ( "[]" ) ;
59- if ( sliceType == "struct" )
60- parseScope ( scope [ 0 ] ) ;
61+ if ( sliceType == "struct" ) {
62+ var allFields = { } ;
63+
64+ // for each field counts how many times appears
65+ for ( var i = 0 ; i < scopeLength ; i ++ )
66+ {
67+ var keys = Object . keys ( scope [ i ] )
68+ for ( var k in keys )
69+ {
70+ var keyname = keys [ k ] ;
71+ if ( ! ( keyname in allFields ) ) {
72+ allFields [ keyname ] = {
73+ value : scope [ i ] [ keyname ] ,
74+ count : 0
75+ }
76+ }
77+
78+ allFields [ keyname ] . count ++ ;
79+ }
80+ }
81+
82+ // create a common struct with all fields found in the current array
83+ // omitempty dict indicates if a field is optional
84+ var keys = Object . keys ( allFields ) , struct = { } , omitempty = { } ;
85+ for ( var k in keys )
86+ {
87+ var keyname = keys [ k ] , elem = allFields [ keyname ] ;
88+
89+ struct [ keyname ] = elem . value ;
90+ omitempty [ keyname ] = elem . count != scopeLength ;
91+ }
92+
93+ parseStruct ( struct , omitempty ) ; // finally parse the struct !!
94+ }
6195 else
6296 append ( sliceType || "interface{}" ) ;
6397 }
6498 else
6599 {
66- append ( "struct {\n" ) ;
67- ++ tabs ;
68- var keys = Object . keys ( scope ) ;
69- for ( var i in keys )
70- {
71- var keyname = keys [ i ] ;
72- indent ( tabs ) ;
73- append ( format ( keyname ) + " " ) ;
74- parseScope ( scope [ keyname ] ) ;
75- append ( ' `json:"' + keyname + '"`\n' ) ;
76- }
77- indent ( -- tabs ) ;
78- append ( "}" ) ;
100+ parseStruct ( scope ) ;
79101 }
80102 }
81103 else
82104 append ( goType ( scope ) ) ;
83105 }
84106
107+ function parseStruct ( scope , omitempty )
108+ {
109+ append ( "struct {\n" ) ;
110+ ++ tabs ;
111+ var keys = Object . keys ( scope ) ;
112+ for ( var i in keys )
113+ {
114+ var keyname = keys [ i ] ;
115+ indent ( tabs ) ;
116+ append ( format ( keyname ) + " " ) ;
117+ parseScope ( scope [ keyname ] ) ;
118+
119+ append ( ' `json:"' + keyname ) ;
120+ if ( omitempty && omitempty [ keyname ] === true )
121+ {
122+ append ( ',omitempty' ) ;
123+ }
124+ append ( '"`\n' ) ;
125+ }
126+ indent ( -- tabs ) ;
127+ append ( "}" ) ;
128+ }
129+
85130 function indent ( tabs )
86131 {
87132 for ( var i = 0 ; i < tabs ; i ++ )
0 commit comments