|
5 | 5 | "encoding/base64"
|
6 | 6 | "encoding/json"
|
7 | 7 | "errors"
|
| 8 | + "fmt" |
8 | 9 | "net/url"
|
9 | 10 | "strconv"
|
10 | 11 | )
|
@@ -47,13 +48,74 @@ func SetURLValuesSliceKeySuffix(s string) error {
|
47 | 48 | // JSON converts the contained object to a JSON string
|
48 | 49 | // representation
|
49 | 50 | func (m Map) JSON() (string, error) {
|
| 51 | + for k, v := range m { |
| 52 | + m[k] = cleanUp(v) |
| 53 | + } |
| 54 | + |
50 | 55 | result, err := json.Marshal(m)
|
51 | 56 | if err != nil {
|
52 | 57 | err = errors.New("objx: JSON encode failed with: " + err.Error())
|
53 | 58 | }
|
54 | 59 | return string(result), err
|
55 | 60 | }
|
56 | 61 |
|
| 62 | +func cleanUpInterfaceArray(in []interface{}) []interface{} { |
| 63 | + result := make([]interface{}, len(in)) |
| 64 | + for i, v := range in { |
| 65 | + result[i] = cleanUp(v) |
| 66 | + } |
| 67 | + return result |
| 68 | +} |
| 69 | + |
| 70 | +func cleanUpInterfaceMap(in map[interface{}]interface{}) Map { |
| 71 | + result := Map{} |
| 72 | + for k, v := range in { |
| 73 | + result[fmt.Sprintf("%v", k)] = cleanUp(v) |
| 74 | + } |
| 75 | + return result |
| 76 | +} |
| 77 | + |
| 78 | +func cleanUpStringMap(in map[string]interface{}) Map { |
| 79 | + result := Map{} |
| 80 | + for k, v := range in { |
| 81 | + result[k] = cleanUp(v) |
| 82 | + } |
| 83 | + return result |
| 84 | +} |
| 85 | + |
| 86 | +func cleanUpMSIArray(in []map[string]interface{}) []Map { |
| 87 | + result := make([]Map, len(in)) |
| 88 | + for i, v := range in { |
| 89 | + result[i] = cleanUpStringMap(v) |
| 90 | + } |
| 91 | + return result |
| 92 | +} |
| 93 | + |
| 94 | +func cleanUpMapArray(in []Map) []Map { |
| 95 | + result := make([]Map, len(in)) |
| 96 | + for i, v := range in { |
| 97 | + result[i] = cleanUpStringMap(v) |
| 98 | + } |
| 99 | + return result |
| 100 | +} |
| 101 | + |
| 102 | +func cleanUp(v interface{}) interface{} { |
| 103 | + switch v := v.(type) { |
| 104 | + case []interface{}: |
| 105 | + return cleanUpInterfaceArray(v) |
| 106 | + case []map[string]interface{}: |
| 107 | + return cleanUpMSIArray(v) |
| 108 | + case map[interface{}]interface{}: |
| 109 | + return cleanUpInterfaceMap(v) |
| 110 | + case Map: |
| 111 | + return cleanUpStringMap(v) |
| 112 | + case []Map: |
| 113 | + return cleanUpMapArray(v) |
| 114 | + default: |
| 115 | + return v |
| 116 | + } |
| 117 | +} |
| 118 | + |
57 | 119 | // MustJSON converts the contained object to a JSON string
|
58 | 120 | // representation and panics if there is an error
|
59 | 121 | func (m Map) MustJSON() string {
|
|
0 commit comments