Convert to JSON now handles non string keys

This commit is contained in:
Mike Farah 2020-09-13 10:44:11 +10:00
parent 5b7b390a33
commit f528b28938
2 changed files with 39 additions and 0 deletions

View File

@ -94,6 +94,28 @@ func TestReadUnwrapJsonByDefaultCmd(t *testing.T) {
test.AssertResult(t, "\"frog\"\n", result.Output) test.AssertResult(t, "\"frog\"\n", result.Output)
} }
func TestReadOutputJsonNonStringKeysCmd(t *testing.T) {
content := `
true: true
5:
null:
0.1: deeply
false: things`
filename := test.WriteTempYamlFile(content)
defer test.RemoveTempYamlFile(filename)
cmd := getRootCommand()
result := test.RunCmd(cmd, fmt.Sprintf("read %s -j", filename))
if result.Error != nil {
t.Error(result.Error)
}
expectedOutput := `{"5":{"null":{"0.1":"deeply","false":"things"}},"true":true}
`
test.AssertResult(t, expectedOutput, result.Output)
}
func TestReadWithAdvancedFilterCmd(t *testing.T) { func TestReadWithAdvancedFilterCmd(t *testing.T) {
cmd := getRootCommand() cmd := getRootCommand()
result := test.RunCmd(cmd, "read ../examples/sample.yaml b.e(name==sam).value") result := test.RunCmd(cmd, "read ../examples/sample.yaml b.e(name==sam).value")

View File

@ -58,6 +58,21 @@ type jsonEncoder struct {
encoder *json.Encoder encoder *json.Encoder
} }
func mapKeysToStrings(node *yaml.Node) {
if node.Kind == yaml.MappingNode {
for index, child := range node.Content {
if index % 2 == 0 { // its a map key
child.Tag = "!!str"
}
}
}
for _, child := range node.Content {
mapKeysToStrings(child)
}
}
func NewJsonEncoder(destination io.Writer, prettyPrint bool, indent int) Encoder { func NewJsonEncoder(destination io.Writer, prettyPrint bool, indent int) Encoder {
var encoder = json.NewEncoder(destination) var encoder = json.NewEncoder(destination)
var indentString = "" var indentString = ""
@ -73,6 +88,8 @@ func NewJsonEncoder(destination io.Writer, prettyPrint bool, indent int) Encoder
func (je *jsonEncoder) Encode(node *yaml.Node) error { func (je *jsonEncoder) Encode(node *yaml.Node) error {
var dataBucket interface{} var dataBucket interface{}
// firstly, convert all map keys to strings
mapKeysToStrings(node)
errorDecoding := node.Decode(&dataBucket) errorDecoding := node.Decode(&dataBucket)
if errorDecoding != nil { if errorDecoding != nil {
return errorDecoding return errorDecoding