goland json.Marshal导致&变成\u0026

本文探讨了Go语言中json.Marshal在处理字符串时将&转为u0026的问题。原因是默认的escapeHtml参数设置为true,导致特殊字符被转义。解决方案包括修改默认行为和直接使用字符串替换方法来避免不必要的转义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:goland后台使用json.Marshal转换时,会将<,>,&转化为unicode编码,导致入库时&变成\u0026。

原因: json.marshal默认escapeHtml为true,会将<、>、&等字符转义。

解决方案1:

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))
}

上面的解决方案能使转换正确,但是会在string(bf.Bytes())或者bf.String()时,默认在字符串结尾加上\n,也不能达到想要的效果。

方案2:

content = strings.ReplaceAll(content, "\\u003c", "<")
content = strings.ReplaceAll(content, "\\u003e", ">")
content = strings.ReplaceAll(content, "\\u0026", "&")

直接使用替换,来替换不符合的字符,简单有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值