1
0

json.go 980 B

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