array.go 942 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package badjson
  2. import (
  3. "bytes"
  4. "github.com/goccy/go-json"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. )
  7. type JSONArray[T any] []T
  8. func (a JSONArray[T]) MarshalJSON() ([]byte, error) {
  9. return json.Marshal([]T(a))
  10. }
  11. func (a *JSONArray[T]) UnmarshalJSON(content []byte) error {
  12. decoder := json.NewDecoder(bytes.NewReader(content))
  13. arrayStart, err := decoder.Token()
  14. if err != nil {
  15. return err
  16. } else if arrayStart != json.Delim('[') {
  17. return E.New("excepted array start, but got ", arrayStart)
  18. }
  19. err = a.decodeJSON(decoder)
  20. if err != nil {
  21. return err
  22. }
  23. arrayEnd, err := decoder.Token()
  24. if err != nil {
  25. return err
  26. } else if arrayEnd != json.Delim(']') {
  27. return E.New("excepted array end, but got ", arrayEnd)
  28. }
  29. return nil
  30. }
  31. func (a *JSONArray[T]) decodeJSON(decoder *json.Decoder) error {
  32. for decoder.More() {
  33. var item T
  34. err := decoder.Decode(&item)
  35. if err != nil {
  36. return err
  37. }
  38. }
  39. return nil
  40. }