@@ -42,8 +42,9 @@ function jsonToGo(json, typename)
42
42
{
43
43
if ( Array . isArray ( scope ) )
44
44
{
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 ++ )
47
48
{
48
49
var thisType = goType ( scope [ i ] ) ;
49
50
if ( ! sliceType )
@@ -55,33 +56,77 @@ function jsonToGo(json, typename)
55
56
break ;
56
57
}
57
58
}
59
+
58
60
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
+ }
61
95
else
62
96
append ( sliceType || "interface{}" ) ;
63
97
}
64
98
else
65
99
{
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 ) ;
79
101
}
80
102
}
81
103
else
82
104
append ( goType ( scope ) ) ;
83
105
}
84
106
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
+
85
130
function indent ( tabs )
86
131
{
87
132
for ( var i = 0 ; i < tabs ; i ++ )
0 commit comments