...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package client
16
17 import (
18 "strconv"
19 "unsafe"
20
21 "github.com/json-iterator/go"
22 "github.com/modern-go/reflect2"
23 )
24
25 type customNumberExtension struct {
26 jsoniter.DummyExtension
27 }
28
29 func (cne *customNumberExtension) CreateDecoder(typ reflect2.Type) jsoniter.ValDecoder {
30 if typ.String() == "interface {}" {
31 return customNumberDecoder{}
32 }
33 return nil
34 }
35
36 type customNumberDecoder struct {
37 }
38
39 func (customNumberDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
40 switch iter.WhatIsNext() {
41 case jsoniter.NumberValue:
42 var number jsoniter.Number
43 iter.ReadVal(&number)
44 i64, err := strconv.ParseInt(string(number), 10, 64)
45 if err == nil {
46 *(*interface{})(ptr) = i64
47 return
48 }
49 f64, err := strconv.ParseFloat(string(number), 64)
50 if err == nil {
51 *(*interface{})(ptr) = f64
52 return
53 }
54 iter.ReportError("DecodeNumber", err.Error())
55 default:
56 *(*interface{})(ptr) = iter.Read()
57 }
58 }
59
60
61
62
63 func caseSensitiveJsonIterator() jsoniter.API {
64 config := jsoniter.Config{
65 EscapeHTML: true,
66 SortMapKeys: true,
67 ValidateJsonRawMessage: true,
68 CaseSensitive: true,
69 }.Froze()
70
71 config.RegisterExtension(&customNumberExtension{})
72 return config
73 }
74
View as plain text