util: adds TraverseJSON
This commit is contained in:
parent
c4ec74872c
commit
401c0513a3
3 changed files with 52 additions and 0 deletions
49
util/traverse.go
Normal file
49
util/traverse.go
Normal file
|
@ -0,0 +1,49 @@
|
|||
package util
|
||||
|
||||
func TraverseJSON(
|
||||
data interface{},
|
||||
keys interface{},
|
||||
) interface{} {
|
||||
var keySlice []string
|
||||
switch k := keys.(type) {
|
||||
case string:
|
||||
keySlice = []string{k}
|
||||
case []string:
|
||||
keySlice = k
|
||||
default:
|
||||
return nil // unsupported keys type
|
||||
}
|
||||
|
||||
return traverseObject(data, keySlice)
|
||||
}
|
||||
|
||||
func traverseObject(data interface{}, keys []string) interface{} {
|
||||
if len(keys) == 0 {
|
||||
return data
|
||||
}
|
||||
|
||||
key := keys[0]
|
||||
remainingKeys := keys[1:]
|
||||
|
||||
switch d := data.(type) {
|
||||
case map[string]interface{}:
|
||||
if value, exists := d[key]; exists {
|
||||
return traverseObject(value, remainingKeys)
|
||||
}
|
||||
|
||||
for _, value := range d {
|
||||
result := traverseObject(value, keys)
|
||||
if result != nil {
|
||||
return result
|
||||
}
|
||||
}
|
||||
case []interface{}:
|
||||
for _, item := range d {
|
||||
result := traverseObject(item, keys)
|
||||
if result != nil {
|
||||
return result
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue