golang - json HTML escaping



尝试使用自定义MarshalJSON来避免转义字符,如& .在这种特殊情况下,使用设置了SetEscapeHTML选项的自定义编码器很不方便。

该函数被调用,其行为符合我的预期。但是,最终结果仍然包含转义形式u0026

https://play.golang.org/p/aktPndOUmth

package main
import (
    "bytes"
    "encoding/json"
    "fmt"
)
type Data struct {
    URL string
}
func (d Data) MarshalJSON() ([]byte, error) {
    data := map[string]interface{}{
        "url": d.URL,
    }
    jsonData, _ := json.Marshal(data)
    jsonData = bytes.Replace(jsonData, []byte("\u0026"), []byte("&"), -1)
    fmt.Println("func: " + string(jsonData))
    return jsonData, nil
}
func main() {
    data := Data{
        URL: "https://test.com?foo=1&bar=2",
    }
    jsonData, _ := json.Marshal(data)
     fmt.Println("main: " + string(jsonData))
}

输出:

func: {"url":"https://test.com?foo=1&bar=2"}
main: {"url":"https://test.com?foo=1u0026bar=2"}

这就是我如何取消转义序列以使 JSON 中的非英语字母可读。它也适用于特殊字符,如<>&

func _UnescapeUnicodeCharactersInJSON(_jsonRaw json.RawMessage) (json.RawMessage, error) {
    str, err := strconv.Unquote(strings.Replace(strconv.Quote(string(_jsonRaw)), `\u`, `u`, -1))
    if err != nil {
        return nil, err
    }
    return []byte(str), nil
}
func main() {
    // Both are valid JSON.
    var jsonRawEscaped json.RawMessage   // json raw with escaped unicode chars
    var jsonRawUnescaped json.RawMessage // json raw with unescaped unicode chars
    // 'u263a' == '☺'
    jsonRawEscaped = []byte(`{"HelloWorld": "uC548uB155, uC138uC0C1(u4E16u4E0A). u263a"}`) // "\u263a"
    jsonRawUnescaped, _ = _UnescapeUnicodeCharactersInJSON(jsonRawEscaped)                        // "☺"
    fmt.Println(string(jsonRawEscaped))   // {"HelloWorld": "uC548uB155, uC138uC0C1(u4E16u4E0A). u263a"}
    fmt.Println(string(jsonRawUnescaped)) // {"HelloWorld": "안녕, 세상(世上). ☺"}
}

https://play.golang.org/p/pUsrzrrcDG-