Refactor json

This commit is contained in:
世界
2022-07-03 19:43:27 +08:00
parent dd56b2584b
commit 28b865acf0
8 changed files with 179 additions and 188 deletions

43
common/badjson/json.go Normal file
View File

@@ -0,0 +1,43 @@
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
}