util: adds TraverseJSON

This commit is contained in:
stefanodvx 2025-04-14 15:24:06 +02:00
parent c4ec74872c
commit 401c0513a3
3 changed files with 52 additions and 0 deletions

1
go.mod
View file

@ -37,6 +37,7 @@ require (
github.com/quic-go/qpack v0.5.1 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/titanous/json5 v1.0.0
github.com/u2takey/go-utils v0.3.1 // indirect
github.com/unki2aut/go-mpd v0.0.0-20250218132413-c6a2d2d492f4
go.uber.org/mock v0.5.0 // indirect

2
go.sum
View file

@ -93,6 +93,8 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/titanous/json5 v1.0.0 h1:hJf8Su1d9NuI/ffpxgxQfxh/UiBFZX7bMPid0rIL/7s=
github.com/titanous/json5 v1.0.0/go.mod h1:7JH1M8/LHKc6cyP5o5g3CSaRj+mBrIimTxzpvmckH8c=
github.com/u2takey/ffmpeg-go v0.5.0 h1:r7d86XuL7uLWJ5mzSeQ03uvjfIhiJYvsRAJFCW4uklU=
github.com/u2takey/ffmpeg-go v0.5.0/go.mod h1:ruZWkvC1FEiUNjmROowOAps3ZcWxEiOpFoHCvk97kGc=
github.com/u2takey/go-utils v0.3.1 h1:TaQTgmEZZeDHQFYfd+AdUT1cT4QJgJn/XVPELhHw4ys=

49
util/traverse.go Normal file
View 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
}