diff --git a/kyaml/yaml/types.go b/kyaml/yaml/types.go index 63c25e701..3b3615265 100644 --- a/kyaml/yaml/types.go +++ b/kyaml/yaml/types.go @@ -688,11 +688,18 @@ func (rn *RNode) MarshalJSON() ([]byte, error) { return nil, err } + if rn.YNode().Kind == SequenceNode { + var a []interface{} + if err := Unmarshal([]byte(s), &a); err != nil { + return nil, err + } + return json.Marshal(a) + } + m := map[string]interface{}{} if err := Unmarshal([]byte(s), &m); err != nil { return nil, err } - return json.Marshal(m) } diff --git a/kyaml/yaml/types_test.go b/kyaml/yaml/types_test.go index 983cd9bc8..a68af4ae5 100644 --- a/kyaml/yaml/types_test.go +++ b/kyaml/yaml/types_test.go @@ -105,21 +105,44 @@ metadata: } func TestRNode_MarshalJSON(t *testing.T) { - instance, err := Parse(` + tests := []struct { + name string + ydoc string + want string + }{ + { + name: "object", + ydoc: ` hello: world -`) - if !assert.NoError(t, err) { - t.FailNow() +`, + want: `{"hello":"world"}`, + }, + { + name: "array", + ydoc: ` +- name: s1 +- name: s2 +`, + want: `[{"name":"s1"},{"name":"s2"}]`, + }, } + for idx := range tests { + tt := tests[idx] + t.Run(tt.name, func(t *testing.T) { + instance, err := Parse(tt.ydoc) + if !assert.NoError(t, err) { + t.FailNow() + } - actual, err := instance.MarshalJSON() - if !assert.NoError(t, err) { - t.FailNow() - } + actual, err := instance.MarshalJSON() + if !assert.NoError(t, err) { + t.FailNow() + } - expected := `{"hello":"world"}` - if !assert.Equal(t, - strings.TrimSpace(expected), strings.TrimSpace(string(actual))) { - t.FailNow() + if !assert.Equal(t, + strings.TrimSpace(tt.want), strings.TrimSpace(string(actual))) { + t.FailNow() + } + }) } }