diff --git a/yaml/tojson.go b/yaml/tojson.go new file mode 100644 index 0000000..dc9756c --- /dev/null +++ b/yaml/tojson.go @@ -0,0 +1,46 @@ +package yaml + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + + yaml "gopkg.in/yaml.v2" +) + +// ToJSON takes an io.Reader containing YAML source and converts it into +// a JSON representation of the YAML object. +func ToJSON(in io.Reader) (io.Reader, error) { + var body interface{} + + if err := yaml.NewDecoder(in).Decode(&body); err != nil { + return nil, fmt.Errorf("Unable to unmarshal YAML: %s", err) + } + + body = convert(body) + + var buf = new(bytes.Buffer) + if err := json.NewEncoder(buf).Encode(body); err != nil { + return nil, fmt.Errorf("Unable to marshal JSON: %s", err) + } + + return buf, nil +} + +// Source: https://stackoverflow.com/a/40737676/1741281 +func convert(i interface{}) interface{} { + switch x := i.(type) { + case map[interface{}]interface{}: + m2 := map[string]interface{}{} + for k, v := range x { + m2[k.(string)] = convert(v) + } + return m2 + case []interface{}: + for i, v := range x { + x[i] = convert(v) + } + } + return i +} diff --git a/yaml/tojson_test.go b/yaml/tojson_test.go new file mode 100644 index 0000000..91ed577 --- /dev/null +++ b/yaml/tojson_test.go @@ -0,0 +1,32 @@ +package yaml + +import ( + "io/ioutil" + "strings" + "testing" +) + +func TestToJSON(t *testing.T) { + src := `Services: +- Orders: + - ID: $save ID1 + SupplierOrderCode: $SupplierOrderCode + - ID: $save ID2 + SupplierOrderCode: 111111 +` + + expected := `{"Services":[{"Orders":[{"ID":"$save ID1","SupplierOrderCode":"$SupplierOrderCode"},{"ID":"$save ID2","SupplierOrderCode":111111}]}]} +` + + j, err := ToJSON(strings.NewReader(src)) + if err != nil { + t.Fatalf("ToJSON failed: %s", err) + } + + real, _ := ioutil.ReadAll(j) + realString := string(real) + + if expected != realString { + t.Errorf("Expected JSON was not created:\nEXPE: %q\nREAL: %q", expected, realString) + } +}