據我所見,我只是做了一個自定義MarshalJSON
方法來替換這些字符:\u003c
和\u003e
:https ://go.dev/play/p/xJ-qcMN9QXl
在上面的示例中,我通過從包含相同欄位的輔助結構發送到封送處理來封送類似的結構,最后一步是替換我實際需要的欄位并回傳。正如您在從MarshalJSON
方法回傳之前放置的列印中看到的那樣,特殊字符已被替換,但在呼叫json.Marshal
func 之后,特殊字符保持不變。
我在這里遺漏了一些東西,但無法弄清楚。感謝你的幫助。謝謝 :)
uj5u.com熱心網友回復:
在Marshal
json 包https://pkg.go.dev/encoding/json#Marshal的檔案中,您將找到以下段落:
字串值編碼為強制轉換為有效 UTF-8 的 JSON 字串,用 Unicode 替換符文替換無效位元組。為了讓 JSON 可以安全地嵌入 HTML 標記中,字串使用 HTMLEscape 進行編碼,將“<”、“>”、“&”、U 2028 和 U 2029 轉義為“\u003c”, “\u003e”、“\u0026”、“\u2028”和“\u2029”。使用編碼器時,可以通過呼叫 SetEscapeHTML(false) 禁用此替換。
所以嘗試使用一個Encoder
示例:
package main
import (
"bytes"
"encoding/json"
"fmt"
)
type Foo struct {
Name string
Surname string
Likes map[string]interface{}
Hates map[string]interface{}
newGuy bool //rpcclonable
}
func main() {
foo := &Foo{
Name: "George",
Surname: "Denkin",
Likes: map[string]interface{}{
"Sports": "volleyball",
"Message": "<Geroge> play volleyball <usually>",
},
}
buf := &bytes.Buffer{} // or &strings.Builder{} as from the example of @mkopriva
enc := json.NewEncoder(buf)
enc.SetEscapeHTML(false)
err := enc.Encode(foo)
if err != nil {
return
}
fmt.Println(buf.String())
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/493498.html