Skip to content

Commit d684fd9

Browse files
author
Tao Wen
committed
remove write empty object
1 parent 4715b53 commit d684fd9

25 files changed

+191
-88
lines changed

generator/decoder.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,15 @@ func decodeAnonymousArray(arrayType *ast.ArrayType) string {
7474

7575
func decodeAnonymousStruct(structType *ast.StructType) string {
7676
decoderName := fmt.Sprintf(`%s_struct%d`, prefix, anonymousCounter)
77+
typeName := nodeToString(structType)
7778
anonymousCounter++
7879
oldLines := lines
7980
lines = []byte{}
80-
_f("func %s_json_unmarshal_field (iter *jsoniter.Iterator, field string, out *%s) bool {", decoderName, nodeToString(structType))
81+
_f("func %s_json_unmarshal_field (iter *jsoniter.Iterator, field string, out *%s) bool {", decoderName, typeName)
8182
decodeStructField(structType)
8283
_l(" return false")
8384
_l("}")
84-
_f("func %s_json_unmarshal (iter *jsoniter.Iterator, out *%s) {", decoderName, nodeToString(structType))
85+
_f("func %s_json_unmarshal (iter *jsoniter.Iterator, out *%s) {", decoderName, typeName)
8586
decodeStruct(decoderName, structType)
8687
_l("}")
8788
anonymousDecoders = append(anonymousDecoders, lines...)

generator/encoder.go

+45-26
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,42 @@ var anonymousEncoders = []byte{}
1212
func generateEncoders(typeSpec *ast.TypeSpec) []byte {
1313
typeName := typeSpec.Name.Name
1414
lines = []byte{}
15-
encodeType(typeSpec.Type)
15+
encodeType(typeName, typeSpec.Type)
1616
mainEncoder := lines
1717
lines = []byte{}
18+
switch x := typeSpec.Type.(type) {
19+
case *ast.StructType:
20+
encodeStructField(x)
21+
case *ast.StarExpr:
22+
encodeOtherField(typeName)
23+
case *ast.MapType:
24+
encodeOtherField(typeName)
25+
case *ast.ArrayType:
26+
encodeOtherField(typeName)
27+
case *ast.Ident:
28+
encodeOtherField(typeName)
29+
default:
30+
reportError(fmt.Errorf("not supported type: %s", nodeToString(typeSpec)))
31+
return nil
32+
}
33+
fieldsEncoder := lines
34+
lines = []byte{}
1835
_f("func %s_json_marshal(stream *jsoniter.Stream, val %s) {", prefix, typeName)
1936
lines = append(lines, mainEncoder...)
2037
_l("}")
38+
_f("func %s_json_marshal_field(stream *jsoniter.Stream, val %s) {", prefix, typeName)
39+
lines = append(lines, fieldsEncoder...)
40+
_l("}")
2141
lines = append(lines, anonymousEncoders...)
2242
return lines
2343
}
2444

25-
func encodeType(t ast.Expr) {
45+
func encodeType(typeName string, t ast.Expr) {
2646
switch x := t.(type) {
2747
case *ast.ArrayType:
2848
encodeArray(x)
2949
case *ast.StructType:
30-
encodeStruct(x)
50+
encodeStruct(typeName, x)
3151
case *ast.MapType:
3252
encodeMap(x)
3353
case *ast.StarExpr:
@@ -74,8 +94,11 @@ func encodeAnonymousStruct(structType *ast.StructType) string {
7494
anonymousCounter++
7595
oldLines := lines
7696
lines = []byte{}
97+
_f("func %s_json_marshal_field (stream *jsoniter.Stream, val %s) {", encoderName, typeName)
98+
encodeStructField(structType)
99+
_l("}")
77100
_f("func %s_json_marshal (stream *jsoniter.Stream, val %s) {", encoderName, typeName)
78-
encodeStruct(structType)
101+
encodeStruct(encoderName, structType)
79102
_l("}")
80103
anonymousEncoders = append(anonymousEncoders, lines...)
81104
lines = oldLines
@@ -114,22 +137,13 @@ func encodeFixedSizeArray(arrayType *ast.ArrayType, length int) {
114137
}
115138

116139
func encodeMap(mapType *ast.MapType) {
117-
_l(" if len(val) == 0 {")
118-
_l(" stream.WriteEmptyObject()")
119-
_l(" } else {")
120-
_l(" isFirst := true")
121-
_l(" stream.WriteObjectHead()")
122-
_l(" for k, v := range val {")
123-
_l(" if isFirst {")
124-
_l(" isFirst = false")
125-
_l(" } else {")
126-
_l(" stream.WriteMore()")
127-
_l(" }")
140+
_l(" stream.WriteObjectHead()")
141+
_l(" for k, v := range val {")
128142
switch x := mapType.Key.(type) {
129143
case *ast.Ident:
130144
switch x.Name {
131145
case "string":
132-
_l(" stream.WriteObjectField(k)")
146+
_l(" stream.WriteObjectField(k)")
133147
case "int":
134148
fallthrough
135149
case "uint":
@@ -159,14 +173,18 @@ func encodeMap(mapType *ast.MapType) {
159173
reportError(fmt.Errorf("unsupported map key type: %s", nodeToString(mapType.Key)))
160174
}
161175
genEncodeStmt(mapType.Value, "v")
162-
_l(" }")
163-
_l(" stream.WriteObjectTail()")
176+
_l(" stream.WriteMore()")
164177
_l(" }")
178+
_l(" stream.WriteObjectTail()")
165179
}
166180

167-
func encodeStruct(structType *ast.StructType) {
181+
func encodeStruct(typeName string, structType *ast.StructType) {
168182
_l(" stream.WriteObjectHead()")
169-
isFirst := true
183+
_f(" %s_json_marshal_field(stream, val)", typeName)
184+
_l(" stream.WriteObjectTail()")
185+
}
186+
187+
func encodeStructField(structType *ast.StructType) {
170188
for _, field := range structType.Fields.List {
171189
if len(field.Names) == 0 {
172190
continue
@@ -192,15 +210,16 @@ func encodeStruct(structType *ast.StructType) {
192210
if isNotExported {
193211
continue
194212
}
195-
if isFirst {
196-
isFirst = false
197-
} else {
198-
_l(" stream.WriteMore()")
199-
}
200213
_f(" stream.WriteObjectField(`%s`)", encodedFieldName)
201214
genEncodeStmt(field.Type, fmt.Sprintf("val.%s", fieldName))
215+
_l(" stream.WriteMore()")
202216
}
203-
_l(" stream.WriteObjectTail()")
217+
}
218+
219+
func encodeOtherField(typeName string) {
220+
_f(` stream.WriteObjectField("%s")`, typeName)
221+
_f(" %s_json_marshal(stream, val)", prefix)
222+
_l(" stream.WriteMore()")
204223
}
205224

206225
func genEncodeStmt(node ast.Node, val string) {

stream_object.go

+13-7
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,19 @@ func (stream *Stream) WriteObjectField(field string) {
1919

2020
// WriteObjectTail write } with possible indention
2121
func (stream *Stream) WriteObjectTail() {
22+
lookBack := len(stream.buf) - 1 - len(stream.Prefix) - len(stream.Indent)*stream.indentCount
23+
if stream.withIndent() {
24+
lookBack -= 1
25+
}
26+
lookBackChar := stream.buf[lookBack]
2227
stream.indentCount -= 1
23-
stream.writeIndent()
24-
stream.writeByte('}')
25-
}
26-
27-
// WriteEmptyObject write {}
28-
func (stream *Stream) WriteEmptyObject() {
29-
stream.writeByte('{')
28+
if lookBackChar == ',' {
29+
stream.buf = stream.buf[:lookBack]
30+
}
31+
if lookBackChar == '{' {
32+
stream.buf = stream.buf[:lookBack+1]
33+
} else {
34+
stream.writeIndent()
35+
}
3036
stream.writeByte('}')
3137
}

value_tests/AnonymousArray_json.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,13 @@ func AnonymousArray_array1_json_unmarshal (iter *jsoniter.Iterator, out *[]strin
5252
}
5353
func AnonymousArray_json_marshal(stream *jsoniter.Stream, val AnonymousArray) {
5454
stream.WriteObjectHead()
55+
AnonymousArray_json_marshal_field(stream, val)
56+
stream.WriteObjectTail()
57+
}
58+
func AnonymousArray_json_marshal_field(stream *jsoniter.Stream, val AnonymousArray) {
5559
stream.WriteObjectField(`Value`)
5660
AnonymousArray_array2_json_marshal(stream, val.Value)
57-
stream.WriteObjectTail()
61+
stream.WriteMore()
5862
}
5963
func AnonymousArray_array2_json_marshal (stream *jsoniter.Stream, val []string) {
6064
if len(val) == 0 {

value_tests/AnonymousMap_json.go

+10-15
Original file line numberDiff line numberDiff line change
@@ -54,25 +54,20 @@ func AnonymousMap_map1_json_unmarshal (iter *jsoniter.Iterator, out *map[string]
5454
}
5555
func AnonymousMap_json_marshal(stream *jsoniter.Stream, val AnonymousMap) {
5656
stream.WriteObjectHead()
57+
AnonymousMap_json_marshal_field(stream, val)
58+
stream.WriteObjectTail()
59+
}
60+
func AnonymousMap_json_marshal_field(stream *jsoniter.Stream, val AnonymousMap) {
5761
stream.WriteObjectField(`Value`)
5862
AnonymousMap_map2_json_marshal(stream, val.Value)
59-
stream.WriteObjectTail()
63+
stream.WriteMore()
6064
}
6165
func AnonymousMap_map2_json_marshal (stream *jsoniter.Stream, val map[string]string) {
62-
if len(val) == 0 {
63-
stream.WriteEmptyObject()
64-
} else {
65-
isFirst := true
66-
stream.WriteObjectHead()
67-
for k, v := range val {
68-
if isFirst {
69-
isFirst = false
70-
} else {
71-
stream.WriteMore()
72-
}
73-
stream.WriteObjectField(k)
66+
stream.WriteObjectHead()
67+
for k, v := range val {
68+
stream.WriteObjectField(k)
7469
stream.WriteString(v)
75-
}
76-
stream.WriteObjectTail()
70+
stream.WriteMore()
7771
}
72+
stream.WriteObjectTail()
7873
}

value_tests/AnonymousStruct_json.go

+14-3
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,30 @@ func AnonymousStruct_struct1_json_unmarshal (iter *jsoniter.Iterator, out *struc
6161
}
6262
func AnonymousStruct_json_marshal(stream *jsoniter.Stream, val AnonymousStruct) {
6363
stream.WriteObjectHead()
64+
AnonymousStruct_json_marshal_field(stream, val)
65+
stream.WriteObjectTail()
66+
}
67+
func AnonymousStruct_json_marshal_field(stream *jsoniter.Stream, val AnonymousStruct) {
6468
stream.WriteObjectField(`Value`)
6569
AnonymousStruct_struct2_json_marshal(stream, val.Value)
66-
stream.WriteObjectTail()
70+
stream.WriteMore()
6771
}
68-
func AnonymousStruct_struct2_json_marshal (stream *jsoniter.Stream, val struct {
72+
func AnonymousStruct_struct2_json_marshal_field (stream *jsoniter.Stream, val struct {
6973
Name string
7074
Price int
7175
}) {
72-
stream.WriteObjectHead()
7376
stream.WriteObjectField(`Name`)
7477
stream.WriteString(val.Name)
7578
stream.WriteMore()
7679
stream.WriteObjectField(`Price`)
7780
stream.WriteInt(val.Price)
81+
stream.WriteMore()
82+
}
83+
func AnonymousStruct_struct2_json_marshal (stream *jsoniter.Stream, val struct {
84+
Name string
85+
Price int
86+
}) {
87+
stream.WriteObjectHead()
88+
AnonymousStruct_struct2_json_marshal_field(stream, val)
7889
stream.WriteObjectTail()
7990
}

value_tests/DoublePtr_json.go

+5
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,8 @@ func DoublePtr_json_marshal(stream *jsoniter.Stream, val DoublePtr) {
4242
stream.WriteString(**val)
4343
}
4444
}
45+
func DoublePtr_json_marshal_field(stream *jsoniter.Stream, val DoublePtr) {
46+
stream.WriteObjectField("DoublePtr")
47+
DoublePtr_json_marshal(stream, val)
48+
stream.WriteMore()
49+
}

value_tests/EmbedNumberStruct_json.go

+3
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,8 @@ func EmbedNumberStruct_json_unmarshal_field(iter *jsoniter.Iterator, field strin
3030
}
3131
func EmbedNumberStruct_json_marshal(stream *jsoniter.Stream, val EmbedNumberStruct) {
3232
stream.WriteObjectHead()
33+
EmbedNumberStruct_json_marshal_field(stream, val)
3334
stream.WriteObjectTail()
3435
}
36+
func EmbedNumberStruct_json_marshal_field(stream *jsoniter.Stream, val EmbedNumberStruct) {
37+
}

value_tests/EmptyStruct_json.go

+3
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,8 @@ func EmptyStruct_json_unmarshal_field(iter *jsoniter.Iterator, field string, out
2929
}
3030
func EmptyStruct_json_marshal(stream *jsoniter.Stream, val EmptyStruct) {
3131
stream.WriteObjectHead()
32+
EmptyStruct_json_marshal_field(stream, val)
3233
stream.WriteObjectTail()
3334
}
35+
func EmptyStruct_json_marshal_field(stream *jsoniter.Stream, val EmptyStruct) {
36+
}

value_tests/IntKeyMap_json.go

+9-13
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,18 @@ func IntKeyMap_json_unmarshal_field(iter *jsoniter.Iterator, field string, out *
4242
return false
4343
}
4444
func IntKeyMap_json_marshal(stream *jsoniter.Stream, val IntKeyMap) {
45-
if len(val) == 0 {
46-
stream.WriteEmptyObject()
47-
} else {
48-
isFirst := true
49-
stream.WriteObjectHead()
50-
for k, v := range val {
51-
if isFirst {
52-
isFirst = false
53-
} else {
54-
stream.WriteMore()
55-
}
45+
stream.WriteObjectHead()
46+
for k, v := range val {
5647
stream.WriteRaw("\"")
5748
stream.WriteInt(k)
5849
stream.WriteRaw("\": ")
5950
stream.WriteString(v)
60-
}
61-
stream.WriteObjectTail()
51+
stream.WriteMore()
6252
}
53+
stream.WriteObjectTail()
54+
}
55+
func IntKeyMap_json_marshal_field(stream *jsoniter.Stream, val IntKeyMap) {
56+
stream.WriteObjectField("IntKeyMap")
57+
IntKeyMap_json_marshal(stream, val)
58+
stream.WriteMore()
6359
}

value_tests/NamedArray_json.go

+5
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,8 @@ func NamedArray_json_marshal(stream *jsoniter.Stream, val NamedArray) {
5151
stream.WriteArrayTail()
5252
}
5353
}
54+
func NamedArray_json_marshal_field(stream *jsoniter.Stream, val NamedArray) {
55+
stream.WriteObjectField("NamedArray")
56+
NamedArray_json_marshal(stream, val)
57+
stream.WriteMore()
58+
}

value_tests/NamedMap_json.go

+10-14
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,16 @@ func NamedMap_json_unmarshal_field(iter *jsoniter.Iterator, field string, out *N
4242
return false
4343
}
4444
func NamedMap_json_marshal(stream *jsoniter.Stream, val NamedMap) {
45-
if len(val) == 0 {
46-
stream.WriteEmptyObject()
47-
} else {
48-
isFirst := true
49-
stream.WriteObjectHead()
50-
for k, v := range val {
51-
if isFirst {
52-
isFirst = false
53-
} else {
54-
stream.WriteMore()
55-
}
56-
stream.WriteObjectField(k)
45+
stream.WriteObjectHead()
46+
for k, v := range val {
47+
stream.WriteObjectField(k)
5748
stream.WriteInt(v)
58-
}
59-
stream.WriteObjectTail()
49+
stream.WriteMore()
6050
}
51+
stream.WriteObjectTail()
52+
}
53+
func NamedMap_json_marshal_field(stream *jsoniter.Stream, val NamedMap) {
54+
stream.WriteObjectField("NamedMap")
55+
NamedMap_json_marshal(stream, val)
56+
stream.WriteMore()
6157
}

value_tests/NamedPtr_json.go

+5
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,8 @@ func NamedPtr_json_unmarshal_field(iter *jsoniter.Iterator, field string, out *N
3131
func NamedPtr_json_marshal(stream *jsoniter.Stream, val NamedPtr) {
3232
stream.WriteString(*val)
3333
}
34+
func NamedPtr_json_marshal_field(stream *jsoniter.Stream, val NamedPtr) {
35+
stream.WriteObjectField("NamedPtr")
36+
NamedPtr_json_marshal(stream, val)
37+
stream.WriteMore()
38+
}

value_tests/NamedStruct_json.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ func NamedStruct_ptr1_json_unmarshal (iter *jsoniter.Iterator, out **json.Number
4848
}
4949
func NamedStruct_json_marshal(stream *jsoniter.Stream, val NamedStruct) {
5050
stream.WriteObjectHead()
51+
NamedStruct_json_marshal_field(stream, val)
52+
stream.WriteObjectTail()
53+
}
54+
func NamedStruct_json_marshal_field(stream *jsoniter.Stream, val NamedStruct) {
5155
stream.WriteObjectField(`Name`)
5256
stream.WriteString(val.Name)
5357
stream.WriteMore()
@@ -60,5 +64,5 @@ func NamedStruct_json_marshal(stream *jsoniter.Stream, val NamedStruct) {
6064
stream.WriteMore()
6165
stream.WriteObjectField(`Raw`)
6266
stream.WriteRawOrNull(string(val.Raw))
63-
stream.WriteObjectTail()
67+
stream.WriteMore()
6468
}

value_tests/NestedArray_json.go

+5
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ func NestedArray_json_marshal(stream *jsoniter.Stream, val NestedArray) {
6565
stream.WriteArrayTail()
6666
}
6767
}
68+
func NestedArray_json_marshal_field(stream *jsoniter.Stream, val NestedArray) {
69+
stream.WriteObjectField("NestedArray")
70+
NestedArray_json_marshal(stream, val)
71+
stream.WriteMore()
72+
}
6873
func NestedArray_array2_json_marshal (stream *jsoniter.Stream, val [2]float64) {
6974
stream.WriteArrayHead()
7075
stream.WriteFloat64(val[0])

0 commit comments

Comments
 (0)