mirror of
				https://gitea.com/gitea/tea.git
				synced 2025-11-04 03:05:26 +01:00 
			
		
		
		
	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:
		@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user