Reputation: 1142
I'm trying to POST some JSON to a server using Go where special characters like ampersand must exist intact in the JSON string I'm sending.
http://play.golang.org/p/bPt9kl88-y
package main
import (
"fmt"
"encoding/json"
)
func main() {
type TransactionStatement struct {
Query string
}
statement := &TransactionStatement{
Query: "my query with this & that",
}
data, _ := json.Marshal(statement)
fmt.Printf("> %v", string(data))
}
Go's json.Marshal is converting certain characters like '&' to unicode. Which is great:
String values encode as JSON strings coerced to valid UTF-8, replacing invalid bytes with the Unicode replacement rune. The angle brackets "<" and ">" are escaped to "\u003c" and "\u003e" to keep some browsers from misinterpreting JSON output as HTML. Ampersand "&" is also escaped to "\u0026" for the same reason. Blockquote
It may sound rediculous but the JSON I'm sending is for a database query using a RESTful endpoint, where this literal string will be used to perform a freetext database query - so I can't use unicode since it's interpreted literally.
So is there any way to prevent this conversion to unicode? Or will I just have to undo these replacements after the marshaling is done?
Thanks
Upvotes: 11
Views: 11880
Reputation: 2608
You can choose not to encode if you wish: https://golang.org/pkg/encoding/json/#Encoder.SetEscapeHTML
https://play.golang.org/p/gfy1WaDrEIH
Upvotes: 5
Reputation: 1142
I just realized after posting other characters are getting encoded to unicode as well and those are indeed working.
Upvotes: 3