Skip to content

Commit 274a3d0

Browse files
committed
Support for array of structs
1 parent 5fc090e commit 274a3d0

File tree

1 file changed

+62
-17
lines changed

1 file changed

+62
-17
lines changed

json-to-go.js

Lines changed: 62 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)