array.go 1.1 KB

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