sing-box/common/badjson/json.go

44 lines
979 B
Go
Raw Normal View History

2022-07-03 19:43:27 +08:00
package badjson
import (
"github.com/goccy/go-json"
E "github.com/sagernet/sing/common/exceptions"
)
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
} else if rawToken != json.Delim('}') {
return nil, E.New("excepted object end, but got ", rawToken)
}
return object, nil
case '[':
var array JSONArray[any]
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
}