1
0
Fork 0
mirror of https://github.com/Luzifer/go_helpers.git synced 2024-12-25 05:21:20 +00:00

Add a YAML to JSON converter as yaml-helper

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2018-06-07 10:59:15 +02:00
parent 94b91ff63a
commit 16d0025db9
Signed by: luzifer
GPG key ID: DC2729FDD34BE99E
2 changed files with 78 additions and 0 deletions

46
yaml/tojson.go Normal file
View file

@ -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
}

32
yaml/tojson_test.go Normal file
View file

@ -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)
}
}