Go json 序列化特殊字符问题

case

不确定入参是什么样的字符串时。

func main() {
	bt := []byte{230, 163}
	args := map[string]string{}
	args["a"] = string(bt)
	fmt.Println("len a", len(args["a"]))
	//json
	input, err := json.Marshal(args)
	if err != nil {
		return
	}

	var b map[string]string
	err = json.Unmarshal(input, &b)

	fmt.Println("len b", len(b["a"]))

}

output :
len a 2
len b 6

why

[]byte{230,163},转为string 之后超出了utf8编码边界
unmarshal 时候,超出utf8 和 utf16 的字符,会被转为unicode编码,所以长度会发生改变.

直接传 []byte 会被转为base64

入参规定了只能string, 所以下面定义struct接收算是扩展吧,我不能用。。。

solve

  • 将value 转为 16进制或base64,服务端单独做一层解码
	bt := []byte{230,136}
	hexStr := hex.EncodeToString(bt)
	args := map[string]string{}
	args["a"] = hexStr

	fmt.Printf("a %v\n",bt)
	println("len a", len(bt))

	input, err := json.Marshal(args)
	if err != nil {
		fmt.Println(err)
	}

	var decodeArgs map[string]string

	err =json.Unmarshal(input, &decodeArgs)
	if err != nil {
		return
	}

	b, err := hex.DecodeString(decodeArgs["a"])

	if err != nil {
		return
	}
	fmt.Println("b", b)
	fmt.Println("len b", len(b))

// output
a [230 136]
len a 2
b [230 136]
len b 2
  • 服务端声明一个对应的接收struct
type  tb struct {
	Bytes []byte
}


func main() {
	bt := []byte{230,136}
	args := tb{Bytes: bt}
	fmt.Printf("a %v\n",bt)
	println("len a", len(bt))

	input, err := json.Marshal(args)
	if err != nil {
		fmt.Println(err)
	}

	var decodeArgs tb

	err =json.Unmarshal(input, &decodeArgs)
	if err != nil {
		return
	}

	if err != nil {
		return
	}
	fmt.Println("b", decodeArgs.Bytes)
	fmt.Println("len b", len(decodeArgs.Bytes))
}

// output
a [230 136]
len a 2
b [230 136]
len b 2
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值