@@ -12,7 +12,7 @@ type Parser struct {
1212 // If populated, only these methods will be considered valid.
1313 validMethods []string
1414
15- // Use JSON Number format in JSON decoder. This field is disabled when using a custom json encoder.
15+ // Use JSON Number format in JSON decoder.
1616 useJSONNumber bool
1717
1818 // Skip claims validation during token parsing.
@@ -24,8 +24,9 @@ type Parser struct {
2424}
2525
2626type decoders struct {
27- jsonUnmarshal JSONUnmarshalFunc
28- base64Decode Base64DecodeFunc
27+ jsonUnmarshal JSONUnmarshalFunc
28+ jsonNewDecoder JSONNewDecoderFunc [JSONDecoder ]
29+ base64Decode Base64DecodeFunc
2930
3031 // This field is disabled when using a custom base64 encoder.
3132 decodeStrict bool
@@ -180,12 +181,20 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke
180181 return token , parts , newError ("could not base64 decode claim" , ErrTokenMalformed , err )
181182 }
182183
183- // If `useJSONNumber` is enabled, then we must use *json.Decoder to decode
184- // the claims. However, this comes with a performance penalty so only use
185- // it if we must and, otherwise, simple use our existing unmarshal function.
184+ // If `useJSONNumber` is enabled, then we must use a dedicated JSONDecoder
185+ // to decode the claims. However, this comes with a performance penalty so
186+ // only use it if we must and, otherwise, simple use our existing unmarshal
187+ // function.
186188 if p .useJSONNumber {
187189 unmarshal = func (data []byte , v any ) error {
188- decoder := json .NewDecoder (bytes .NewBuffer (claimBytes ))
190+ buffer := bytes .NewBuffer (claimBytes )
191+
192+ var decoder JSONDecoder
193+ if p .jsonNewDecoder != nil {
194+ decoder = p .jsonNewDecoder (buffer )
195+ } else {
196+ decoder = json .NewDecoder (buffer )
197+ }
189198 decoder .UseNumber ()
190199 return decoder .Decode (v )
191200 }
0 commit comments