@@ -63,22 +63,34 @@ func (g *Generator) genTypeDecoder(t reflect.Type, out string, tags fieldTags, i
63
63
64
64
unmarshalerIface := reflect .TypeOf ((* easyjson .Unmarshaler )(nil )).Elem ()
65
65
if reflect .PtrTo (t ).Implements (unmarshalerIface ) {
66
- fmt .Fprintln (g .out , ws + "(" + out + ").UnmarshalEasyJSON(in)" )
66
+ fmt .Fprintln (g .out , ws + "if in.IsNull() {" )
67
+ fmt .Fprintln (g .out , ws + " in.Skip()" )
68
+ fmt .Fprintln (g .out , ws + "} else {" )
69
+ fmt .Fprintln (g .out , ws + " (" + out + ").UnmarshalEasyJSON(in)" )
70
+ fmt .Fprintln (g .out , ws + "}" )
67
71
return nil
68
72
}
69
73
70
74
unmarshalerIface = reflect .TypeOf ((* json .Unmarshaler )(nil )).Elem ()
71
75
if reflect .PtrTo (t ).Implements (unmarshalerIface ) {
72
- fmt .Fprintln (g .out , ws + "if data := in.Raw(); in.Ok() {" )
73
- fmt .Fprintln (g .out , ws + " in.AddError( (" + out + ").UnmarshalJSON(data) )" )
76
+ fmt .Fprintln (g .out , ws + "if in.IsNull() {" )
77
+ fmt .Fprintln (g .out , ws + " in.Skip()" )
78
+ fmt .Fprintln (g .out , ws + "} else {" )
79
+ fmt .Fprintln (g .out , ws + " if data := in.Raw(); in.Ok() {" )
80
+ fmt .Fprintln (g .out , ws + " in.AddError( (" + out + ").UnmarshalJSON(data) )" )
81
+ fmt .Fprintln (g .out , ws + " }" )
74
82
fmt .Fprintln (g .out , ws + "}" )
75
83
return nil
76
84
}
77
85
78
86
unmarshalerIface = reflect .TypeOf ((* encoding .TextUnmarshaler )(nil )).Elem ()
79
87
if reflect .PtrTo (t ).Implements (unmarshalerIface ) {
80
- fmt .Fprintln (g .out , ws + "if data := in.UnsafeBytes(); in.Ok() {" )
81
- fmt .Fprintln (g .out , ws + " in.AddError( (" + out + ").UnmarshalText(data) )" )
88
+ fmt .Fprintln (g .out , ws + "if in.IsNull() {" )
89
+ fmt .Fprintln (g .out , ws + " in.Skip()" )
90
+ fmt .Fprintln (g .out , ws + "} else {" )
91
+ fmt .Fprintln (g .out , ws + " if data := in.UnsafeBytes(); in.Ok() {" )
92
+ fmt .Fprintln (g .out , ws + " in.AddError( (" + out + ").UnmarshalText(data) )" )
93
+ fmt .Fprintln (g .out , ws + " }" )
82
94
fmt .Fprintln (g .out , ws + "}" )
83
95
return nil
84
96
}
@@ -110,13 +122,21 @@ func (g *Generator) genTypeDecoderNoCheck(t reflect.Type, out string, tags field
110
122
ws := strings .Repeat (" " , indent )
111
123
// Check whether type is primitive, needs to be done after interface check.
112
124
if dec := customDecoders [t .String ()]; dec != "" {
113
- fmt .Fprintln (g .out , ws + out + " = " + dec )
125
+ fmt .Fprintln (g .out , ws + "if in.IsNull() {" )
126
+ fmt .Fprintln (g .out , ws + " in.Skip()" )
127
+ fmt .Fprintln (g .out , ws + "} else {" )
128
+ fmt .Fprintln (g .out , ws + " " + out + " = " + dec )
129
+ fmt .Fprintln (g .out , ws + "}" )
114
130
return nil
115
131
} else if dec := primitiveStringDecoders [t .Kind ()]; dec != "" && tags .asString {
116
132
if tags .intern && t .Kind () == reflect .String {
117
133
dec = "in.StringIntern()"
118
134
}
119
- fmt .Fprintln (g .out , ws + out + " = " + g .getType (t )+ "(" + dec + ")" )
135
+ fmt .Fprintln (g .out , ws + "if in.IsNull() {" )
136
+ fmt .Fprintln (g .out , ws + " in.Skip()" )
137
+ fmt .Fprintln (g .out , ws + "} else {" )
138
+ fmt .Fprintln (g .out , ws + " " + out + " = " + g .getType (t )+ "(" + dec + ")" )
139
+ fmt .Fprintln (g .out , ws + "}" )
120
140
return nil
121
141
} else if dec := primitiveDecoders [t .Kind ()]; dec != "" {
122
142
if tags .intern && t .Kind () == reflect .String {
@@ -125,7 +145,11 @@ func (g *Generator) genTypeDecoderNoCheck(t reflect.Type, out string, tags field
125
145
if tags .noCopy && t .Kind () == reflect .String {
126
146
dec = "in.UnsafeString()"
127
147
}
128
- fmt .Fprintln (g .out , ws + out + " = " + g .getType (t )+ "(" + dec + ")" )
148
+ fmt .Fprintln (g .out , ws + "if in.IsNull() {" )
149
+ fmt .Fprintln (g .out , ws + " in.Skip()" )
150
+ fmt .Fprintln (g .out , ws + "} else {" )
151
+ fmt .Fprintln (g .out , ws + " " + out + " = " + g .getType (t )+ "(" + dec + ")" )
152
+ fmt .Fprintln (g .out , ws + "}" )
129
153
return nil
130
154
}
131
155
0 commit comments