|
1 | 1 | package output |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "bytes" |
4 | 5 | "encoding/json" |
5 | 6 | "fmt" |
6 | 7 | "io" |
@@ -28,10 +29,23 @@ func shouldColor() bool { |
28 | 29 | return term.IsTerminal(int(os.Stdout.Fd())) |
29 | 30 | } |
30 | 31 |
|
| 32 | +// marshalJSON encodes v to indented JSON without HTML-escaping & < >. |
| 33 | +func marshalJSON(v any) ([]byte, error) { |
| 34 | + var buf bytes.Buffer |
| 35 | + enc := json.NewEncoder(&buf) |
| 36 | + enc.SetEscapeHTML(false) |
| 37 | + enc.SetIndent("", " ") |
| 38 | + if err := enc.Encode(v); err != nil { |
| 39 | + return nil, err |
| 40 | + } |
| 41 | + // Encoder always appends a trailing newline; trim it for consistent handling. |
| 42 | + return bytes.TrimRight(buf.Bytes(), "\n"), nil |
| 43 | +} |
| 44 | + |
31 | 45 | // PrintJSON prints a value to stdout as pretty-printed JSON. |
32 | 46 | // Colorized when stdout is a TTY and NO_COLOR is not set. |
33 | 47 | func PrintJSON(v any) error { |
34 | | - data, err := json.MarshalIndent(v, "", " ") |
| 48 | + data, err := marshalJSON(v) |
35 | 49 | if err != nil { |
36 | 50 | return err |
37 | 51 | } |
@@ -67,7 +81,7 @@ func PrintJQValue(v any, w io.Writer) error { |
67 | 81 | _, err := fmt.Fprintln(w, val) |
68 | 82 | return err |
69 | 83 | default: |
70 | | - data, err := json.MarshalIndent(v, "", " ") |
| 84 | + data, err := marshalJSON(v) |
71 | 85 | if err != nil { |
72 | 86 | return err |
73 | 87 | } |
|
0 commit comments