array.go 961 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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. type JSONArray []any
  8. func (a JSONArray) MarshalJSON() ([]byte, error) {
  9. return json.Marshal([]any(a))
  10. }
  11. func (a *JSONArray) 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) decodeJSON(decoder *json.Decoder) error {
  32. for decoder.More() {
  33. item, err := decodeJSON(decoder)
  34. if err != nil {
  35. return err
  36. }
  37. *a = append(*a, item)
  38. }
  39. return nil
  40. }