Reputation: 43
I have written an API with Golang. This API does receive data from other services then it responses to users in type of JSON string. Here is the problems I got.
type message struct {
Data string `json:"data"`
}
func test(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
data := // Retrieve message that contain backslash
json.NewEncoder(w).Encode(message{Data: data})
}
` If there is a backslash in data that receive from other API. This API will send the response with double backslashes.
Example.
Received data:
"asdasdasd\asdasdasd"
Response data:
{"data": "asdasdasd\\asdasdasd"}
I have try to figure this out. Here what I got. All of this will be fine if I try to print out in the screen by using fmt.Println()
.
I only get problem when I try to send those out put in JSON string. Therefore, is there any way to send those data without double backslashes?
Upvotes: 3
Views: 6448
Reputation: 20467
As suggested in the comments, json.RawMessage
does the trick.
data := map[string]interface{}{}
data["date"] = json.RawMessage([]byte(`"\/Date(1590105600000)\/"`))
b := new(bytes.Buffer)
json.NewEncoder(b).Encode(data)
fmt.Println(b.String())
// {"date":"\/Date(1590105600000)\/"}
Upvotes: 1
Reputation: 21
Golang default render will escape JSON, but if you want to disable it you need to define custom renderer like this:
encoder := json.NewEncoder(w)
encoder.SetEscapeHTML(false)
encoder.Encode(data)
Upvotes: 0
Reputation: 2442
I asked pretty much the same question a couple days ago, here's the post.
Basically you don't want your Data to be a string
but an interface{}
instead.
type message struct {
Data interface{} `json:"data"`
}
I think this may apply to you also. And if you want to go RESTFul and return different types of structs, this is definitely the way to go.
Upvotes: 1
Reputation: 7973
You can create a custom method and replace double backslashes with a single one.
Something like that:
func JSONMarshal(v interface{}, backslashEscape bool) ([]byte, error) {
b, err := json.Marshal(v)
if backslashEscape {
b = bytes.Replace(b, []byte(`\\`), []byte(`\`), -1)
}
return b, err
}
The json/encoder
packages has also DisableHTMLEscaping
, if set to true, default is false, it allows you to escape HTML chars.
Upvotes: -1