From f3b0f4319dae676cc22776cdffb4e7b161d10da9 Mon Sep 17 00:00:00 2001 From: Maxime mouial Date: Mon, 23 Feb 2026 13:50:45 +0100 Subject: [PATCH] Add support for JSON to slice cast This adds support for JSON array when casting to slice of string in the same way that JSON is supported when casting to a map. --- slice.go | 8 ++++++++ slice_test.go | 2 ++ 2 files changed, 10 insertions(+) diff --git a/slice.go b/slice.go index e6a8328..59c450f 100644 --- a/slice.go +++ b/slice.go @@ -6,6 +6,7 @@ package cast import ( + "encoding/json" "fmt" "reflect" "strings" @@ -90,8 +91,15 @@ func ToStringSliceE(i any) ([]string, error) { var a []string + if nonPointerI, ok := indirect(i); ok { + i = nonPointerI + } + switch v := i.(type) { case string: + if err := json.Unmarshal([]byte(v), &a); err == nil { + return a, nil + } return strings.Fields(v), nil case any: str, err := ToStringE(v) diff --git a/slice_test.go b/slice_test.go index fb7597c..95f7e5e 100644 --- a/slice_test.go +++ b/slice_test.go @@ -258,6 +258,8 @@ func TestStringSlice(t *testing.T) { {[]any{1, 3}, []string{"1", "3"}, false}, {any(1), []string{"1"}, false}, {[]error{errors.New("a"), errors.New("b")}, []string{"a", "b"}, false}, + {"[\"a\", \"b\"]", []string{"a", "b"}, false}, + {"a b", []string{"a", "b"}, false}, // Failure cases {nil, nil, true},