Fix bug when output json with special chars (#801)

Fix #800

Reviewed-on: https://gitea.com/gitea/tea/pulls/801
This commit is contained in:
Lunny Xiao
2025-09-10 20:36:27 +00:00
parent 6c958eec99
commit d3c73cd5dc
2 changed files with 26 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,17 @@ 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 {
fmt.Printf("Failed to format JSON for value '%s': %v\n", val, err)
return
}
key, err := json.Marshal(toSnakeCase(headers[j]))
if err != nil {
fmt.Printf("Failed to format JSON for header '%s': %v\n", headers[j], err)
return
}
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)
}
}