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  }