mirror of
				https://gitea.com/gitea/tea.git
				synced 2025-10-31 17:25:27 +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
	 Lunny Xiao
					Lunny Xiao