...
1 package jsonx
2
3 import (
4 "encoding/json"
5 "strconv"
6 "strings"
7
8 "github.com/tidwall/gjson"
9 )
10
11
12 func Flatten(raw json.RawMessage) map[string]interface{} {
13 parsed := gjson.ParseBytes(raw)
14 if !parsed.IsObject() {
15 return nil
16 }
17
18 flattened := make(map[string]interface{})
19 flatten(parsed, nil, flattened)
20 return flattened
21 }
22
23 func flatten(parsed gjson.Result, parents []string, flattened map[string]interface{}) {
24 if parsed.IsObject() {
25 parsed.ForEach(func(k, v gjson.Result) bool {
26 flatten(v, append(parents, strings.ReplaceAll(k.String(), ".", "\\.")), flattened)
27 return true
28 })
29 } else if parsed.IsArray() {
30 for kk, vv := range parsed.Array() {
31 flatten(vv, append(parents, strconv.Itoa(kk)), flattened)
32 }
33 } else {
34 flattened[strings.Join(parents, ".")] = parsed.Value()
35 }
36 }
37
View as plain text