Skip to content

Commit 84b5b69

Browse files
author
Tao Wen
committed
handle embed ptr field nil
1 parent 6276a13 commit 84b5b69

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

generator/encoder.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,6 @@ func encodeStructEmbedField(fieldType ast.Expr) {
225225
_f(" %s_json_marshal_field(stream, val.%s)", x.Name, x.Name)
226226
}
227227
case *ast.StarExpr:
228-
// TODO: handle nil pointer
229228
switch y := x.X.(type) {
230229
case *ast.Ident:
231230
isNotExported := unicode.IsLower(rune(y.Name[0]))
@@ -237,9 +236,13 @@ func encodeStructEmbedField(fieldType ast.Expr) {
237236
_l(" }")
238237
case *ast.SelectorExpr:
239238
if y.Sel.Name == "Number" {
240-
_l(` stream.WriteObjectField("Number")`)
241-
_l(` stream.WriteRawOrZero((string)(*val.Number))`)
242-
_l(` stream.WriteMore()`)
239+
_l(` stream.WriteObjectField("Number")`)
240+
_l(" if val.Number == nil {")
241+
_l(` stream.WriteNull()`)
242+
_l(` } else {`)
243+
_l(` stream.WriteRawOrZero((string)(*val.Number))`)
244+
_l(` }`)
245+
_l(` stream.WriteMore()`)
243246
} else if y.Sel.Name == "RawMessage" {
244247
reportError(fmt.Errorf("embed json.RawMessage is not supported"))
245248
return
@@ -251,7 +254,9 @@ func encodeStructEmbedField(fieldType ast.Expr) {
251254
reportError(fmt.Errorf("unknown import: %s", alias))
252255
return
253256
}
254-
_f(" %s_json_marshal_field(stream, *val.%s)", nodeToString(y), y.Sel.Name)
257+
_f(" if val.%s != nil {", y.Sel.Name)
258+
_f(" %s_json_marshal_field(stream, *val.%s)", nodeToString(y), y.Sel.Name)
259+
_l(" }")
255260
}
256261
default:
257262
reportError(fmt.Errorf("unknown embed field type: %s", nodeToString(fieldType)))

value_tests/sub/EmbedViaPtr_json.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,7 @@ func EmbedViaPtr_json_marshal(stream *jsoniter.Stream, val EmbedViaPtr) {
4040
stream.WriteObjectTail()
4141
}
4242
func EmbedViaPtr_json_marshal_field(stream *jsoniter.Stream, val EmbedViaPtr) {
43-
value_tests.NamedArray_json_marshal_field(stream, *val.NamedArray)
43+
if val.NamedArray != nil {
44+
value_tests.NamedArray_json_marshal_field(stream, *val.NamedArray)
45+
}
4446
}

0 commit comments

Comments
 (0)