json_conf.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // +build json
  2. package loader
  3. import (
  4. "encoding/json"
  5. "github.com/v2ray/v2ray-core/common/log"
  6. )
  7. type JSONConfigLoader struct {
  8. *BaseConfigLoader
  9. idKey string
  10. configKey string
  11. }
  12. func NewJSONConfigLoader(idKey string, configKey string) *JSONConfigLoader {
  13. return &JSONConfigLoader{
  14. idKey: idKey,
  15. configKey: configKey,
  16. BaseConfigLoader: NewBaseConfigLoader(),
  17. }
  18. }
  19. func (this *JSONConfigLoader) LoadWithID(raw []byte, id string) (interface{}, error) {
  20. config, err := this.CreateConfig(id)
  21. if err != nil {
  22. return nil, err
  23. }
  24. if err := json.Unmarshal(raw, config); err != nil {
  25. return nil, err
  26. }
  27. return config, nil
  28. }
  29. func (this *JSONConfigLoader) Load(raw []byte) (interface{}, string, error) {
  30. var obj map[string]json.RawMessage
  31. if err := json.Unmarshal(raw, &obj); err != nil {
  32. return nil, "", err
  33. }
  34. rawID, found := obj[this.idKey]
  35. if !found {
  36. log.Error(this.idKey, " not found in JSON content.")
  37. return nil, "", ErrConfigIDKeyNotFound
  38. }
  39. var id string
  40. if err := json.Unmarshal(rawID, &id); err != nil {
  41. return nil, "", err
  42. }
  43. rawConfig := json.RawMessage(raw)
  44. if len(this.configKey) > 0 {
  45. configValue, found := obj[this.configKey]
  46. if !found {
  47. log.Error(this.configKey, " not found in JSON content.")
  48. return nil, "", ErrConfigIDKeyNotFound
  49. }
  50. rawConfig = configValue
  51. }
  52. config, err := this.LoadWithID([]byte(rawConfig), id)
  53. if err != nil {
  54. return nil, id, err
  55. }
  56. return config, id, nil
  57. }