util: adds TraverseJSON
This commit is contained in:
parent
c4ec74872c
commit
401c0513a3
3 changed files with 52 additions and 0 deletions
1
go.mod
1
go.mod
|
@ -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
2
go.sum
|
@ -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
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