github.com/clinia/x@v0.0.53/jsonx/flatten.go (about) 1 // Copyright © 2023 Ory Corp 2 // SPDX-License-Identifier: Apache-2.0 3 4 package jsonx 5 6 import ( 7 "encoding/json" 8 "strconv" 9 "strings" 10 11 "github.com/tidwall/gjson" 12 ) 13 14 // Flatten flattens a JSON object using dot notation. 15 func Flatten(raw json.RawMessage) map[string]interface{} { 16 parsed := gjson.ParseBytes(raw) 17 if !parsed.IsObject() { 18 return nil 19 } 20 21 flattened := make(map[string]interface{}) 22 flatten(parsed, nil, flattened) 23 return flattened 24 } 25 26 func flatten(parsed gjson.Result, parents []string, flattened map[string]interface{}) { 27 if parsed.IsObject() { 28 parsed.ForEach(func(k, v gjson.Result) bool { 29 flatten(v, append(parents, strings.ReplaceAll(k.String(), ".", "\\.")), flattened) 30 return true 31 }) 32 } else if parsed.IsArray() { 33 for kk, vv := range parsed.Array() { 34 flatten(vv, append(parents, strconv.Itoa(kk)), flattened) 35 } 36 } else { 37 flattened[strings.Join(parents, ".")] = parsed.Value() 38 } 39 }