golang中json.marshal字符转义问题

最近在封装自定义json库,数据结构用自带的map,序列化接口调用了json.marshal去实现,发现&字符序列化之后变成了\u0026。

1、查阅了godoc文档,解释如下:

String values encode as JSON strings coerced to valid UTF-8, replacing invalid bytes with the Unicode replacement rune. The angle brackets “<” and “>” are escaped to “\u003c” and “\u003e” to keep some browsers from misinterpreting JSON output as HTML. Ampersand “&” is also escaped to “\u0026” for the same reason. This escaping can be disabled using an Encoder that had SetEscapeHTML(false) called on it.

也就是说json.marshal默认escapeHtml为true,会将<、>、&等字符转义。

godoc打开方式可参考如下:

1、直接在CMD下,运行godoc -http=:8080就可以了;
2、然后再浏览器上输入127.0.0.1:8080就可以访问本地的GO DOC文档库;

2、解决方案

package main

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

type MarshalTest struct {
	Url string `json:"url"`
}

//序列化
func marshal_inner(data interface{}) ([]byte, error) {
	bf := bytes.NewBuffer([]byte{})
	jsonEncoder := json.NewEncoder(bf)
	jsonEncoder.SetEscapeHTML(false)
	if err := jsonEncoder.Encode(data); err != nil {
		return nil, err
	}

	return bf.Bytes(), nil
}

func main() {
	t := &MarshalTest{
		Url: "http://www.baidu.com?seq=213&uuid=1",
	}
	val, err := marshal_inner(t)
	if err != nil {
		fmt.Println("marshal_inner failed.err:", err)
		return
	}
	fmt.Println("marshal_inner val:", string(val))
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值