1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package b64
import (
"encoding/base64"
"encoding/json"
)
func Loose(s string) ([]byte, bool) {
for _, enc := range []*base64.Encoding{base64.StdEncoding, base64.RawStdEncoding, base64.URLEncoding, base64.RawURLEncoding} {
if b, err := enc.DecodeString(s); err == nil {
return b, true
}
}
return nil, false
}
func NormalizeJSON(value any) any {
switch v := value.(type) {
case map[string]any:
if s, ok := v["$bytes"].(string); ok && len(v) == 1 {
if b, ok := Loose(s); ok {
return map[string]any{"$bytes": base64.RawStdEncoding.EncodeToString(b)}
}
return v
}
out := make(map[string]any, len(v))
for k, item := range v {
out[k] = NormalizeJSON(item)
}
return out
case []any:
out := make([]any, len(v))
for i, item := range v {
out[i] = NormalizeJSON(item)
}
return out
default:
return value
}
}
func NormalizeJSONBytes(raw []byte) ([]byte, error) {
var value any
if err := json.Unmarshal(raw, &value); err != nil {
return nil, err
}
return json.Marshal(NormalizeJSON(value))
}