Skip to content

Commit 34b8292

Browse files
Merge branch 'master' into json-support-omitzero
2 parents 9ac5db0 + 7b9ca4e commit 34b8292

File tree

2 files changed

+35
-5
lines changed

2 files changed

+35
-5
lines changed

json/decode.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,15 +1292,19 @@ func (d decoder) decodeInterface(b []byte, p unsafe.Pointer) ([]byte, error) {
12921292

12931293
switch k.Class() {
12941294
case Object:
1295-
v, err = decodeInto[map[string]any](&val, v, d, decoder.decodeMapStringInterface)
1295+
m := make(map[string]interface{})
1296+
v, err = d.decodeMapStringInterface(v, unsafe.Pointer(&m))
1297+
val = m
12961298

12971299
case Array:
1298-
size := alignedSize(interfaceType)
1299-
fn := constructSliceDecodeFunc(size, sliceInterfaceType, decoder.decodeInterface)
1300-
v, err = decodeInto[[]any](&val, v, d, fn)
1300+
a := make([]interface{}, 0, 10)
1301+
v, err = d.decodeSlice(v, unsafe.Pointer(&a), unsafe.Sizeof(a[0]), sliceInterfaceType, decoder.decodeInterface)
1302+
val = a
13011303

13021304
case String:
1303-
v, err = decodeInto[string](&val, v, d, decoder.decodeString)
1305+
s := ""
1306+
v, err = d.decodeString(v, unsafe.Pointer(&s))
1307+
val = s
13041308

13051309
case Null:
13061310
v, val = nil, nil

json/golang_bench_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,32 @@ func BenchmarkUnmarshalString(b *testing.B) {
261261
})
262262
}
263263

264+
func BenchmarkUnmarshalObjectMixed(b *testing.B) {
265+
b.ReportAllocs()
266+
data := []byte(`{"string":"hello world","time":"2025-07-17T18:40:04.338Z","bool":true,"integer":42,"decimal":3.14,"null":null,"object":{"hello":"world"},"array":[1,2,3]}`)
267+
b.RunParallel(func(pb *testing.PB) {
268+
var m map[string]any
269+
for pb.Next() {
270+
if err := Unmarshal(data, &m); err != nil {
271+
b.Fatal("Unmarshal:", err)
272+
}
273+
}
274+
})
275+
}
276+
277+
func BenchmarkUnmarshalArrayMixed(b *testing.B) {
278+
b.ReportAllocs()
279+
data := []byte(`["hello world","2025-07-17T18:40:04.338Z",true,42,3.14,null,{"hello":"world"},[1,2,3]]`)
280+
b.RunParallel(func(pb *testing.PB) {
281+
var a []any
282+
for pb.Next() {
283+
if err := Unmarshal(data, &a); err != nil {
284+
b.Fatal("Unmarshal:", err)
285+
}
286+
}
287+
})
288+
}
289+
264290
func BenchmarkUnmarshalFloat64(b *testing.B) {
265291
b.ReportAllocs()
266292
data := []byte(`3.14`)

0 commit comments

Comments
 (0)