Fix bug when output json with special chars

This commit is contained in:
Lunny Xiao
2025-08-26 10:37:10 -07:00
parent 8876fe3cb8
commit 9d34a185fe
2 changed files with 21 additions and 6 deletions

View File

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

View File

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