The result of this program is {"x":["1 1 3"], "y":["2", "3"]}.
But why is not {"x":["1+1+3"], "y":["2", "3"]}?
What do I need to do to get the expected result"1+1+3"?
import (
"encoding/json"
"fmt"
"log"
"net/url"
"strings"
)
func main() {
m, err := url.ParseQuery(`x=1+1+3&y=2&y=3`)
if err != nil {
log.Fatal(err)
}
fmt.Println(toJSON(m))
}
func toJSON(m any) string {
js, err := json.Marshal(m)
if err != nil {
log.Fatal(err)
}
return strings.ReplaceAll(string(js), ",", ", ")
}
Sandbox: https://go.dev/play/p/o0TiRTVpaQk
{"x":["1+1+3"], "y":["2", "3"]}
>Solution :
url.ParseQuery replaces + with
relevant code fragment:
case '+':
if mode == encodeQueryComponent {
t.WriteByte(' ')
} else {
t.WriteByte('+')
}
the solution is to encode + (replace them with %2B)
like so:
import (
"encoding/json"
"fmt"
"log"
"net/url"
"strings"
)
func main() {
m, err := url.ParseQuery(`x=1%2B1%2B3&y=2&y=3`)
if err != nil {
log.Fatal(err)
}
fmt.Println(toJSON(m))
}
func toJSON(m any) string {
js, err := json.Marshal(m)
if err != nil {
log.Fatal(err)
}
return strings.ReplaceAll(string(js), ",", ", ")
}