为了账号安全,请及时绑定邮箱和手机立即绑定

使用自定义 MarshalJSON 方法替换 go 序列化中的字符

使用自定义 MarshalJSON 方法替换 go 序列化中的字符

Go
蛊毒传说 2022-12-19 21:39:32
据我所知,我只是做了一个定制的MarshalJSON方法来替换这些字符:\u003c和\u003e:https ://go.dev/play/p/xJ-qcMN9QXl在上面的示例中,我通过从包含相同字段的辅助结构发送到编组来编组类似的结构,最后一步是替换我实际需要的字段和返回。正如您在从MarshalJSON方法返回之前放置的打印中看到的那样,特殊字符被替换了,但是在调用json.Marshalfunc 之后,特殊字符保持不变。我在这里缺少但无法弄清楚的东西。感谢你的帮助。谢谢 :)
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

Marshaljson 包的文档中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())

}


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信