Go的Marshal和MarshalIndent都会进行HTML特殊字符转义如 &转成 \u0026,如果要取消转义的话,可以按如下方式写:
func JSONMarshal(t interface{
}, escapeHtml bool) ([]byte, error) {
buffer := &bytes.Buffer{
}
encoder := json.NewEncoder(buffer)
encoder.SetEscapeHTML(escapeHtml)
err := encoder.Encode(t)
return buffer.Bytes(), err
}
func JSONMarshalIndent(t interface{
}, escapeHtml bool, prefix, indent string) ([]byte, error) {
buffer := &bytes.Buffer{
}
encoder := json.NewEncoder(buffer)
encoder.SetEscapeHTML(escapeHtml)
encoder.SetIndent(prefix, indent)
err := encoder.Encode(t)
return buffer.Bytes(), err
}
Go的Marshal源码如下,把escapeHTML: true写死了,无法设置。
func Marshal(v interface{
}) ([]byte, error) {
e := newEncodeState()
err := e.marshal(v, encOpts{
escapeHTML: true})
if err != nil {
return nil, err
}
buf := append([]byte(nil), e.Bytes()...)
e.Reset()
encodeStatePool.Put(e)
return buf, nil
}