首页 >后端开发 >Golang >如何在 Go 中的 JSON 封送过程中防止 `` 转义?

如何在 Go 中的 JSON 封送过程中防止 `` 转义?

Linda Hamilton
Linda Hamilton原创
2024-12-21 10:33:14420浏览

How to Prevent `` Escaping During JSON Marshaling in Go?

克服编码障碍:抑制

和> json.Marshal中的转义

简介

在处理JSON格式的数据时,有时需要保留某些字符,例如

和 >,作为编码字符串的一部分。然而,json.Marshal(用于将对象转换为 JSON 字符串的默认 Go 库函数)会自动转义这些字符以防止潜在的安全漏洞。当数据包含依赖于这些字符的 HTML 或 XML 代码时,这可能会出现问题。

package main

import (
    "encoding/json"
    "fmt"
)

type Track struct {
    XmlRequest string `json:"xmlRequest"`
}

func main() {
    track := new(Track)
    track.XmlRequest = "<car><mirror>XML</mirror></car>"
    trackJSON, _ := json.Marshal(track)
    fmt.Println("After Marshal:", string(trackJSON))
}
问题

{"xmlRequest":"\u003ccar\u003e\u003cmirror\u003eXML\u003c/mirror\u003e\u003c/car\u003e"}
在以下代码片段中,XmlRequest 字段包含 HTML-类似内容,但是经过 json.Marshal 编码后,字符被转义:

{"xmlRequest":"<car><mirror>XML</mirror></car>"}
生成的 JSON 字符串为:

所需的 JSON 字符串为:

func (t *Track) JSON() ([]byte, error) {
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    if err := encoder.Encode(t); err != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}
解决方案

trackJSON, err := track.JSON()
从 Go 1.7 开始,内部没有内置机制json.Marshal 禁用转义。不过,解决方法是创建一个显式控制转义行为的自定义函数。

func JSONMarshal(v interface{}) ([]byte, error) {
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetEscapeHTML(false)
    if err := encoder.Encode(v); err != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}
在此自定义 JSON() 方法中,编码器的 SetEscapeHTML 标志设置为 false,从而禁用 HTML 字符转义。通过调用此方法而不是 json.Marshal,可以保留原始内容而无需转义:或者,可以通过创建一个以任何 interface{} 作为输入的函数来实现更通用的解决方案:

以上是如何在 Go 中的 JSON 封送过程中防止 `` 转义?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn