...

Source file src/github.com/ory/x/jsonx/flatten.go

Documentation: github.com/ory/x/jsonx

     1  package jsonx
     2  
     3  import (
     4  	"encoding/json"
     5  	"strconv"
     6  	"strings"
     7  
     8  	"github.com/tidwall/gjson"
     9  )
    10  
    11  // Flatten flattens a JSON object using dot notation.
    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