json.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package badjson
  2. import (
  3. "bytes"
  4. "github.com/sagernet/sing-box/common/json"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. )
  7. func Decode(content []byte) (any, error) {
  8. decoder := json.NewDecoder(bytes.NewReader(content))
  9. return decodeJSON(decoder)
  10. }
  11. func decodeJSON(decoder *json.Decoder) (any, error) {
  12. rawToken, err := decoder.Token()
  13. if err != nil {
  14. return nil, err
  15. }
  16. switch token := rawToken.(type) {
  17. case json.Delim:
  18. switch token {
  19. case '{':
  20. var object JSONObject
  21. err = object.decodeJSON(decoder)
  22. if err != nil {
  23. return nil, err
  24. }
  25. rawToken, err = decoder.Token()
  26. if err != nil {
  27. return nil, err
  28. } else if rawToken != json.Delim('}') {
  29. return nil, E.New("excepted object end, but got ", rawToken)
  30. }
  31. return &object, nil
  32. case '[':
  33. var array JSONArray
  34. err = array.decodeJSON(decoder)
  35. if err != nil {
  36. return nil, err
  37. }
  38. rawToken, err = decoder.Token()
  39. if err != nil {
  40. return nil, err
  41. } else if rawToken != json.Delim(']') {
  42. return nil, E.New("excepted array end, but got ", rawToken)
  43. }
  44. return array, nil
  45. default:
  46. return nil, E.New("excepted object or array end: ", token)
  47. }
  48. }
  49. return rawToken, nil
  50. }