diff --git a/resolve.go b/resolve.go index 0a3fb09..f9b231e 100644 --- a/resolve.go +++ b/resolve.go @@ -110,3 +110,12 @@ func Resolve[T any](simpleJson *simplejson.Json) (T, error) { return zero, errors.Errorf("unsupported generic type: %T. unable to resolve JSON value.", zero) } } + +// GetList retrieves a slice of simplejson.Json objects from the key's list (a[key]). +func GetList(simpleJson *simplejson.Json, key string) (simpleJsons []*simplejson.Json, err error) { + elements, err := simpleJson.Get(key).Array() + if err != nil { + return simpleJsons, errors.WithMessage(err, "unable to get list") + } + return List(elements), nil +} diff --git a/resolve_test.go b/resolve_test.go index 37b356e..6075218 100644 --- a/resolve_test.go +++ b/resolve_test.go @@ -238,3 +238,36 @@ func TestResolve_Bytes(t *testing.T) { t.Log(res) require.Equal(t, "abc", string(res)) } + +func TestGetList(t *testing.T) { + jsonData := `{ + "key": [ + {"name": "item1"}, + {"name": "item2"}, + {"name": "item3"} + ] + }` + + simpleJson, err := simplejsonx.Load([]byte(jsonData)) + require.NoError(t, err) + + { + simpleJsons, err := simplejsonx.GetList(simpleJson, "key") + require.NoError(t, err) + require.Len(t, simpleJsons, 3) + + var names = make([]string, 0, len(simpleJsons)) + for _, item := range simpleJsons { + name, err := simplejsonx.Extract[string](item, "name") + require.NoError(t, err) + names = append(names, name) + } + require.Equal(t, []string{"item1", "item2", "item3"}, names) + } + + { + simpleJsons, err := simplejsonx.GetList(simpleJson, "invalidKey") + require.Error(t, err) + require.Len(t, simpleJsons, 0) + } +} diff --git a/sure/simplejson_must/resolve_must.go b/sure/simplejson_must/resolve_must.go index 6ef8dc4..7ea31ca 100644 --- a/sure/simplejson_must/resolve_must.go +++ b/sure/simplejson_must/resolve_must.go @@ -23,3 +23,9 @@ func Resolve[T any](simpleJson *simplejson.Json) T { sure.Must(err) return res0 } + +func GetList(simpleJson *simplejson.Json, key string) (simpleJsons []*simplejson.Json) { + simpleJsons, err := simplejsonx.GetList(simpleJson, key) + sure.Must(err) + return simpleJsons +} diff --git a/sure/simplejson_must/wrap_must.go b/sure/simplejson_must/wrap_must.go index 9e87e59..fab9c03 100644 --- a/sure/simplejson_must/wrap_must.go +++ b/sure/simplejson_must/wrap_must.go @@ -17,7 +17,7 @@ func Wrap(value interface{}) (simpleJson *simplejson.Json) { return simpleJson } -func List(items []interface{}) (elements []*simplejson.Json) { - elements = simplejsonx.List(items) - return elements +func List(elements []interface{}) (simpleJsons []*simplejson.Json) { + simpleJsons = simplejsonx.List(elements) + return simpleJsons } diff --git a/sure/simplejson_omit/resolve_omit.go b/sure/simplejson_omit/resolve_omit.go index cdaff09..0440fa0 100644 --- a/sure/simplejson_omit/resolve_omit.go +++ b/sure/simplejson_omit/resolve_omit.go @@ -23,3 +23,9 @@ func Resolve[T any](simpleJson *simplejson.Json) T { sure.Omit(err) return res0 } + +func GetList(simpleJson *simplejson.Json, key string) (simpleJsons []*simplejson.Json) { + simpleJsons, err := simplejsonx.GetList(simpleJson, key) + sure.Omit(err) + return simpleJsons +} diff --git a/sure/simplejson_omit/wrap_omit.go b/sure/simplejson_omit/wrap_omit.go index 1449b03..aaeef67 100644 --- a/sure/simplejson_omit/wrap_omit.go +++ b/sure/simplejson_omit/wrap_omit.go @@ -17,7 +17,7 @@ func Wrap(value interface{}) (simpleJson *simplejson.Json) { return simpleJson } -func List(items []interface{}) (elements []*simplejson.Json) { - elements = simplejsonx.List(items) - return elements +func List(elements []interface{}) (simpleJsons []*simplejson.Json) { + simpleJsons = simplejsonx.List(elements) + return simpleJsons } diff --git a/sure/simplejson_soft/resolve_soft.go b/sure/simplejson_soft/resolve_soft.go index 2ef25c7..0c2867a 100644 --- a/sure/simplejson_soft/resolve_soft.go +++ b/sure/simplejson_soft/resolve_soft.go @@ -23,3 +23,9 @@ func Resolve[T any](simpleJson *simplejson.Json) T { sure.Soft(err) return res0 } + +func GetList(simpleJson *simplejson.Json, key string) (simpleJsons []*simplejson.Json) { + simpleJsons, err := simplejsonx.GetList(simpleJson, key) + sure.Soft(err) + return simpleJsons +} diff --git a/sure/simplejson_soft/wrap_soft.go b/sure/simplejson_soft/wrap_soft.go index 854bb15..5473b2a 100644 --- a/sure/simplejson_soft/wrap_soft.go +++ b/sure/simplejson_soft/wrap_soft.go @@ -17,7 +17,7 @@ func Wrap(value interface{}) (simpleJson *simplejson.Json) { return simpleJson } -func List(items []interface{}) (elements []*simplejson.Json) { - elements = simplejsonx.List(items) - return elements +func List(elements []interface{}) (simpleJsons []*simplejson.Json) { + simpleJsons = simplejsonx.List(elements) + return simpleJsons } diff --git a/wrap.go b/wrap.go index 9469532..0d46832 100644 --- a/wrap.go +++ b/wrap.go @@ -22,10 +22,10 @@ func Wrap(value interface{}) (simpleJson *simplejson.Json) { } // List converts a slice of items into a slice of simplejson.Json objects. -func List(items []interface{}) (elements []*simplejson.Json) { - elements = make([]*simplejson.Json, 0, len(items)) - for _, item := range items { - elements = append(elements, Wrap(item)) +func List(elements []interface{}) (simpleJsons []*simplejson.Json) { + simpleJsons = make([]*simplejson.Json, 0, len(elements)) + for _, elem := range elements { + simpleJsons = append(simpleJsons, Wrap(elem)) } - return elements + return simpleJsons }