0%

解决Golang下json.Marshal默认对html标签转义问题

最近在用Golang下的json对含有html标签的Object序列化的时候,发现Golang会默认对html标签做转义处理。比如我的一段html代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<div id="choose-results" class="li" style="display:none"><div class="dt">已选择</div><div class="dd"></div</div>
<div id="choose-luodipei" class="choose-luodipei li" style="display<div class="dt">送装服务</div>
<div class="dd"></div>
</div>
<div id="choose-suits" class="li choose-suits" style="display:none">
<div class="dt">套&#x3000;&#x3000;装</div>
<div class="dd clearfix"></div>
</div>
<div id="choose-gift" class="choose-gift li" style="display: none;">
<div class="dt">搭配赠品</div>
<div class="dd clearfix">
<div class="gift J-gift" clstag="shangpin|keycount|product|dapeizengpin">
<i class="sprite-gift J-popup"></i><span class="gift-tips">选择搭配赠品(共<em>0</em>个)</span>
</div>
<!--choosed-->
<div class="J-gift-selected hide">
<div class="gift choosed J-gift-choosed"></div>
<a href="#none" class="gift-modify J-popup" clstag="shangpin|keycount|product|zengpin-genggai">更改</a>

在经过 json.Marshal() 处理之后就变成了:

1
\u003cdiv id=\"choose-results\" class=\"li\" style=\"display:none\"\u003e\u003cdiv class=\"dt\"\u003e已选择\u003c/div\u003e\u003cdiv class=\"dd\"\u003e\u003c/div\u003e\u003c/div\u003e\n                                    \u003c/div\u003e\n\n                                                \n                                                                                                \u003cdiv id=\"choose-luodipei\" class=\"choose-luodipei li\" style=\"display:none\"\u003e\n                    \u003cdiv class=\"dt\"\u003e送装服务\u003c/div\u003e\n                    \u003cdiv class=\"dd\"\u003e\u003c/div\u003e\n                \u003c/div\u003e\n                                                                \u003cdiv id=\"choose-suits\" class=\"li choose-suits\" style=\"display:none\"\u003e\n                    \u003cdiv class=\"dt\"\u003e套\u0026#x3000;\u0026#x3000;装\u003c/div\u003e\n                    \u003cdiv class=\"dd clearfix\"\u003e\u003c/div\u003e\n                \u003c/div\u003e\n                                \u003cdiv id=\"choose-gift\" class=\"choose-gift li\"  style=\"display: none;\"\u003e\n                    \u003cdiv class=\"dt\"\u003e搭配赠品\u003c/div\u003e\n                    \u003cdiv class=\"dd clearfix\"\u003e\n                        \u003cdiv class=\"gift J-gift\" clstag=\"shangpin|keycount|product|dapeizengpin\"\u003e\n                            \u003ci class=\"sprite-gift J-popup\"\u003e\u003c/i\u003e\u003cspan class=\"gift-tips\"\u003e选择搭配赠品(共\u003cem\u003e0\u003c/em\u003e个)\u003c/span\u003e\n                        \u003c/div\u003e\n                        \u003c!--choosed--\u003e\n                        \u003cdiv class=\"J-gift-selected hide\"\u003e\n                            \u003cdiv class=\"gift choosed J-gift-choosed\"\u003e\u003c/div\u003e\n                            \u003ca href=\"#none\" class=\"gift-modify J-popup\" clstag=\"shangpin|keycount|product|zengpin-genggai\"\u003e更改\u003c/a\u003e\n

通过上网搜索,发现Golang为我们提供了一个 SetEscapeHTML() 方法,默认情况下该值为 true ,我们只要将其设置为 false 即可实现不对html标签转义。

我的封装方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package utils

import (
"bytes"
"encoding/json"
)

// json.Marshal方法优化,不对html做转义处理
func MarshalHTML(v interface{}) ([]byte, error) {
var buf bytes.Buffer
enc := json.NewEncoder(&buf)
enc.SetEscapeHTML(false)
err := enc.Encode(v)
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}

如有疑问或需要技术讨论,请留言或发邮件到 service@itfanr.cc