diff --git a/modules/print/table.go b/modules/print/table.go index 1fa78b7..ca5cc1e 100644 --- a/modules/print/table.go +++ b/modules/print/table.go @@ -4,6 +4,7 @@ package print import ( + "encoding/json" "fmt" "io" "os" @@ -164,6 +165,8 @@ func toSnakeCase(str string) string { } // outputJSON prints structured data as json +// Since golang's map is unordered, we need to ensure consistent ordering, we have +// to output the JSON ourselves. func outputJSON(f io.Writer, headers []string, values [][]string) { fmt.Fprintln(f, "[") itemCount := len(values) @@ -172,12 +175,12 @@ func outputJSON(f io.Writer, headers []string, values [][]string) { for i, value := range values { fmt.Fprintf(f, "%s{\n", space) for j, val := range value { - intVal, _ := strconv.Atoi(val) - if strconv.Itoa(intVal) == val { - fmt.Fprintf(f, "%s%s\"%s\": %s", space, space, toSnakeCase(headers[j]), val) - } else { - fmt.Fprintf(f, "%s%s\"%s\": \"%s\"", space, space, toSnakeCase(headers[j]), val) + v, err := json.Marshal(val) + if err != nil { + return } + key, _ := json.Marshal(toSnakeCase(headers[j])) + fmt.Fprintf(f, "%s:%s", key, v) if j != headersCount-1 { fmt.Fprintln(f, ",") } else { diff --git a/modules/print/table_test.go b/modules/print/table_test.go index f58b757..060e5b8 100644 --- a/modules/print/table_test.go +++ b/modules/print/table_test.go @@ -21,6 +21,9 @@ func TestPrint(t *testing.T) { values: [][]string{ {"new a", "some bbbb"}, {"AAAAA", "b2"}, + {"\"abc", "\"def"}, + {"'abc", "de'f"}, + {"\\abc", "'def\\"}, }, } @@ -33,7 +36,16 @@ func TestPrint(t *testing.T) { }{} assert.NoError(t, json.NewDecoder(buf).Decode(&result)) - if assert.Len(t, result, 2) { + if assert.Len(t, result, 5) { assert.EqualValues(t, "new a", result[0].A) + assert.EqualValues(t, "some bbbb", result[0].B) + assert.EqualValues(t, "AAAAA", result[1].A) + assert.EqualValues(t, "b2", result[1].B) + assert.EqualValues(t, "\"abc", result[2].A) + assert.EqualValues(t, "\"def", result[2].B) + assert.EqualValues(t, "'abc", result[3].A) + assert.EqualValues(t, "de'f", result[3].B) + assert.EqualValues(t, "\\abc", result[4].A) + assert.EqualValues(t, "'def\\", result[4].B) } }