govd/util/traverse.go
2025-04-14 15:24:06 +02:00

49 lines
871 B
Go

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
}