防止“<”的 JSON 转义和“>”和 json.Marshal
使用 json.Marshal 将结构体转换为 JSON 时,特殊字符如“<”和“>”自动转义为其 Unicode 等效项。但是,在某些情况下,您可能希望保留这些字符的原始形式。
问题陈述
考虑以下 Go 程序:
package main import ( "encoding/json" "fmt" ) type Track struct { XmlRequest string `json:"xmlRequest"` } func main() { message := new(Track) message.XmlRequest = "<car><mirror>XML</mirror></car>" fmt.Println("Before Marshal", message) messageJSON, _ := json.Marshal(message) fmt.Println("After marshal", string(messageJSON)) }<p>输出:</p> <pre class="brush:php;toolbar:false">Before Marshal {<car><mirror>XML</mirror></car>} After marshal {"xmlRequest":"\u003ccar\u003e\u003cmirror\u003eXML\u003c/mirror\u003e\u003c/car\u003e"}
如您所见,“”字符已分别转义为“u003c”和“u003e”。
解决方案
从 Go 1.7 开始,json.Marshal 不提供禁用 HTML 转义的选项。但是,有一个使用自定义函数的解决方法:
func (t *Track) JSON() ([]byte, error) { buffer := &bytes.Buffer{} encoder := json.NewEncoder(buffer) encoder.SetEscapeHTML(false) err := encoder.Encode(t) return buffer.Bytes(), err }
通过调用此函数而不是 json.Marshal,可以防止“<”的转义和“>”。
输出:
{"xmlRequest":"<car><mirror>XML</mirror></car>"}
以上是如何防止 Go 的 json.Marshal 中'”的 JSON 转义?的详细内容。更多信息请关注PHP中文网其他相关文章!