| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- package badjson
- import (
- "bytes"
- "github.com/sagernet/sing-box/common/json"
- E "github.com/sagernet/sing/common/exceptions"
- )
- func Decode(content []byte) (any, error) {
- decoder := json.NewDecoder(bytes.NewReader(content))
- return decodeJSON(decoder)
- }
- func decodeJSON(decoder *json.Decoder) (any, error) {
- rawToken, err := decoder.Token()
- if err != nil {
- return nil, err
- }
- switch token := rawToken.(type) {
- case json.Delim:
- switch token {
- case '{':
- var object JSONObject
- err = object.decodeJSON(decoder)
- if err != nil {
- return nil, err
- }
- rawToken, err = decoder.Token()
- if err != nil {
- return nil, err
- } else if rawToken != json.Delim('}') {
- return nil, E.New("excepted object end, but got ", rawToken)
- }
- return &object, nil
- case '[':
- var array JSONArray
- err = array.decodeJSON(decoder)
- if err != nil {
- return nil, err
- }
- rawToken, err = decoder.Token()
- if err != nil {
- return nil, err
- } else if rawToken != json.Delim(']') {
- return nil, E.New("excepted array end, but got ", rawToken)
- }
- return array, nil
- default:
- return nil, E.New("excepted object or array end: ", token)
- }
- }
- return rawToken, nil
- }
|