encoding.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package encoding
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "github.com/pelletier/go-toml/v2"
  6. "github.com/zeromicro/go-zero/core/lang"
  7. "gopkg.in/yaml.v2"
  8. )
  9. func TomlToJson(data []byte) ([]byte, error) {
  10. var val interface{}
  11. if err := toml.NewDecoder(bytes.NewReader(data)).Decode(&val); err != nil {
  12. return nil, err
  13. }
  14. var buf bytes.Buffer
  15. if err := json.NewEncoder(&buf).Encode(val); err != nil {
  16. return nil, err
  17. }
  18. return buf.Bytes(), nil
  19. }
  20. func YamlToJson(data []byte) ([]byte, error) {
  21. var val interface{}
  22. if err := yaml.Unmarshal(data, &val); err != nil {
  23. return nil, err
  24. }
  25. val = toStringKeyMap(val)
  26. var buf bytes.Buffer
  27. if err := json.NewEncoder(&buf).Encode(val); err != nil {
  28. return nil, err
  29. }
  30. return buf.Bytes(), nil
  31. }
  32. func convertKeyToString(in map[interface{}]interface{}) map[string]interface{} {
  33. res := make(map[string]interface{})
  34. for k, v := range in {
  35. res[lang.Repr(k)] = toStringKeyMap(v)
  36. }
  37. return res
  38. }
  39. func convertNumberToJsonNumber(in interface{}) json.Number {
  40. return json.Number(lang.Repr(in))
  41. }
  42. func convertSlice(in []interface{}) []interface{} {
  43. res := make([]interface{}, len(in))
  44. for i, v := range in {
  45. res[i] = toStringKeyMap(v)
  46. }
  47. return res
  48. }
  49. func toStringKeyMap(v interface{}) interface{} {
  50. switch v := v.(type) {
  51. case []interface{}:
  52. return convertSlice(v)
  53. case map[interface{}]interface{}:
  54. return convertKeyToString(v)
  55. case bool, string:
  56. return v
  57. case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64, float32, float64:
  58. return convertNumberToJsonNumber(v)
  59. default:
  60. return lang.Repr(v)
  61. }
  62. }