From 9c74312402575f5e988b3355f27b43e4aab572ad Mon Sep 17 00:00:00 2001 From: mlange-42 Date: Thu, 18 Apr 2024 15:10:32 +0200 Subject: [PATCH] prevent escaping special characters in JSON output --- CHANGELOG.md | 1 + cmd/isso/main.go | 28 ++++++++++++++++------------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b12e70a..658b0b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ### Other * Changed formatting functions to methods of type Solution (#13) +* Prevent escaping special characters in JSON output (#14) ## [[v0.2.0]](https://github.com/mlange-42/isso/compare/v0.1.0...v0.2.0) diff --git a/cmd/isso/main.go b/cmd/isso/main.go index 69d9eed..b074473 100644 --- a/cmd/isso/main.go +++ b/cmd/isso/main.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "os" + "strings" "github.com/mlange-42/isso" "github.com/mlange-42/isso/fitness" @@ -90,42 +91,45 @@ func run(file, format string, csvDelimiter string, pareto bool) (string, error) fmt.Fprintf(os.Stderr, "Found %d solution(s)\n\n", len(solution)) - output := "" + b := strings.Builder{} switch format { case "json": - jsData, err = json.MarshalIndent(&solution, "", " ") + enc := json.NewEncoder(&b) + enc.SetEscapeHTML(false) + enc.SetIndent("", " ") + err = enc.Encode(&solution) if err != nil { return "", err } - output = fmt.Sprintln(string(jsData)) + b.WriteString(fmt.Sprintln(string(jsData))) case "table": for _, sol := range solution { - output += fmt.Sprintln(sol.ToTable()) - output += fmt.Sprintf("(%d trips, %d samples)\n", sol.Fitness.Trips, sol.Fitness.Samples) - output += fmt.Sprintln("------------------------------------------------------------") + b.WriteString(fmt.Sprintln(sol.ToTable())) + b.WriteString(fmt.Sprintf("(%d trips, %d samples)\n", sol.Fitness.Trips, sol.Fitness.Samples)) + b.WriteString(fmt.Sprintln("------------------------------------------------------------")) } case "csv": for i, sol := range solution { - output += fmt.Sprint(sol.ToCSV(i, csvDelimiter)) + b.WriteString(fmt.Sprint(sol.ToCSV(i, csvDelimiter))) } case "list": for _, sol := range solution { - output += fmt.Sprintln(sol.ToList()) - output += fmt.Sprintf("(%d trips, %d samples)\n", sol.Fitness.Trips, sol.Fitness.Samples) - output += fmt.Sprintln("------------------------------------------------------------") + b.WriteString(fmt.Sprintln(sol.ToList())) + b.WriteString(fmt.Sprintf("(%d trips, %d samples)\n", sol.Fitness.Trips, sol.Fitness.Samples)) + b.WriteString(fmt.Sprintln("------------------------------------------------------------")) } case "fitness": for _, sol := range solution { - output += fmt.Sprintf("(%d trips, %d samples)\n", sol.Fitness.Trips, sol.Fitness.Samples) + b.WriteString(fmt.Sprintf("(%d trips, %d samples)\n", sol.Fitness.Trips, sol.Fitness.Samples)) } default: return "", fmt.Errorf("unknown format '%s'", format) } - return output, nil + return b.String(), nil }