golang: encoding/json包关于&<>字符的转义

golang: encoding/json包关于&<>字符的转义

版本环境:

$ go version
go version go1.13.6 windows/amd64

示例代码:

package main

import (
	"encoding/json"
	"log"
)

func main() {

	object := struct {
		Value string
	}{
		Value:"test1280&<>",
	}

	if result, err := json.Marshal(object); err == nil {
		log.Print(string(result))
	} else {
		log.Fatal(err)
	}
}

运行输出:

$ go run main.go
2020/09/27 18:22:29 {"Value":"test1280\u0026\u003c\u003e"}

我们预期的是{“Value”:“test1280&<>”},输出与预期不相符合。

异常原因:

golang标准包encoding/json 默认地 将&<>这三个字符进行转义。

其实JSON规范中并没有要求将&<>作为特殊字符转义处理,仅仅是encoding/json自己的行为。

官网说明:

https://golang.org/pkg/encoding/json/

String values encode as JSON strings coerced to valid UTF-8, replacing invalid bytes with the Unicode replacement rune. So that the JSON will be safe to embed inside HTML <script> tags, the string is encoded using HTMLEscape, which replaces “<”, “>”, “&”, U+2028, and U+2029 are escaped to “\u003c”,"\u003e", “\u0026”, “\u2028”, and “\u2029”. This replacement can be disabled when using an Encoder, by calling SetEscapeHTML(false).

which replaces “<”, “>”, “&”, U+2028, and U+2029 are escaped to “\u003c”,"\u003e", “\u0026”, “\u2028”, and “\u2029”

解决办法:

可以参考golang官网提供的接口来 关闭默认开启的转义行为开关

https://golang.org/pkg/encoding/json/#Encoder.SetEscapeHTML

Code:

package main

import (
	"bytes"
	"encoding/json"
	"log"
)

func main() {

	object := struct {
		Value string
	}{
		Value:"test1280&<>",
	}

	buffer := &bytes.Buffer{}
	encoder := json.NewEncoder(buffer)
	encoder.SetEscapeHTML(false)
	err := encoder.Encode(object)

	if err != nil {
		log.Fatal(err)
	}

	log.Print(string(buffer.Bytes())) // log.Print(buffer.String())
}

运行输出:

$ go run main.go
2020/09/27 21:56:03 {"Value":"test1280&<>"}

Value的值包含&<>并且没有被转义。

参考资料:
1.https://blog.csdn.net/lgh1700/article/details/104522878
2.https://blog.csdn.net/weixin_38707040/article/details/103664391
3.https://blog.csdn.net/naruto227/article/details/103810101
4.https://blog.csdn.net/liuhui251435428/article/details/102905213

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值