Skip to content

Commit 6276a13

Browse files
author
Tao Wen
committed
json.Number default to 0
1 parent 6ff3933 commit 6276a13

File tree

5 files changed

+24
-5
lines changed

5 files changed

+24
-5
lines changed

generator/encoder.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ func encodeStructEmbedField(fieldType ast.Expr) {
238238
case *ast.SelectorExpr:
239239
if y.Sel.Name == "Number" {
240240
_l(` stream.WriteObjectField("Number")`)
241-
_l(` stream.WriteRawOrNull((string)(*val.Number))`)
241+
_l(` stream.WriteRawOrZero((string)(*val.Number))`)
242242
_l(` stream.WriteMore()`)
243243
} else if y.Sel.Name == "RawMessage" {
244244
reportError(fmt.Errorf("embed json.RawMessage is not supported"))
@@ -260,7 +260,7 @@ func encodeStructEmbedField(fieldType ast.Expr) {
260260
case *ast.SelectorExpr:
261261
if x.Sel.Name == "Number" {
262262
_l(` stream.WriteObjectField("Number")`)
263-
_l(` stream.WriteRawOrNull((string)(val.Number))`)
263+
_l(` stream.WriteRawOrZero((string)(val.Number))`)
264264
_l(` stream.WriteMore()`)
265265
} else if x.Sel.Name == "RawMessage" {
266266
reportError(fmt.Errorf("embed json.RawMessage is not supported"))
@@ -304,7 +304,9 @@ func genEncodeStmt(node ast.Node, val string) {
304304
genEncodeStmt(x.X, "*"+val)
305305
_l(" }")
306306
case *ast.SelectorExpr:
307-
if x.Sel.Name == "Number" || x.Sel.Name == "RawMessage" {
307+
if x.Sel.Name == "Number" {
308+
_f(" stream.WriteRawOrZero(string(%s))", val)
309+
} else if x.Sel.Name == "RawMessage" {
308310
_f(" stream.WriteRawOrNull(string(%s))", val)
309311
}
310312
default:

stream.go

+8
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ func (stream *Stream) WriteRawOrNull(s string) {
6464
}
6565
}
6666

67+
func (stream *Stream) WriteRawOrZero(s string) {
68+
if s == "" {
69+
stream.WriteRaw("0")
70+
} else {
71+
stream.WriteRaw(s)
72+
}
73+
}
74+
6775
// WriteNull write null to stream
6876
func (stream *Stream) WriteNull() {
6977
stream.writeFourBytes('n', 'u', 'l', 'l')

value_tests/EmbedNumberStruct_json.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ func EmbedNumberStruct_json_marshal(stream *jsoniter.Stream, val EmbedNumberStru
3535
}
3636
func EmbedNumberStruct_json_marshal_field(stream *jsoniter.Stream, val EmbedNumberStruct) {
3737
stream.WriteObjectField("Number")
38-
stream.WriteRawOrNull((string)(val.Number))
38+
stream.WriteRawOrZero((string)(val.Number))
3939
stream.WriteMore()
4040
}

value_tests/NamedStruct_json.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func NamedStruct_json_marshal_field(stream *jsoniter.Stream, val NamedStruct) {
5959
if val.Price == nil {
6060
stream.WriteNull()
6161
} else {
62-
stream.WriteRawOrNull(string(*val.Price))
62+
stream.WriteRawOrZero(string(*val.Price))
6363
}
6464
stream.WriteMore()
6565
stream.WriteObjectField(`Raw`)

value_tests/struct_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,12 @@ func Test_struct8(t *testing.T) {
7777
var val2 NamedStruct
7878
compareWithStdlib(`{"Raw":["a",1]}`, jsoniter.CreateJsonAdapter(NamedStruct_json{}), &val1, &val2)
7979
}
80+
81+
func Test_struct9(t *testing.T) {
82+
var val1 EmbedNumberStruct
83+
jsonAdapter := jsoniter.CreateJsonAdapter(EmbedNumberStruct_json{})
84+
bytes, _ := jsonAdapter.MarshalIndent(val1, "", "")
85+
if !strings.Contains(string(bytes), `{"Number":0}`) {
86+
t.Fatal(string(bytes))
87+
}
88+
}

0 commit comments

Comments
 (0)