msgpack代替json防止丢失类型

描述

开发了一个通信协议, 协议对数据类型比较敏感, 根据不同数据数据类型使用不同格式。golang的数据类型能够满足需求。

然而,将协议转为http方式时,如果传入json,会发现数据类型不符合预期

例如,本来是应该int结果是float64; 本来应该是[]byte,结果是string

环境

http服务器: gin

开发语言: golang

解决方法探寻

什么传输协议会带上数据类型?

  • json类型丢失

默认情况下gin的BindJSON,可将传入的参数绑定到具体的结构体,产生类型转换。然后,我的结果需要是动态的,不知道参数的具体内容。

  • 自定义参数格式,将类型带上。例如 marchinery
Arg struct{
    Type string
    Value interface{}
}

缺点:太麻烦

  • 常用协议中选择

xml 可以用,不理想

yaml 不能解决问题

protobuf 不能解决问题

messagepack 有详细的数据类型,完美

msgpack替代json

gin示例

func SendXX(c *gin.Context){
    rawData, _ := c.GetRawData()
    var param interface{}
    msgpack.Unmarshal(rawData, &param)

	result := struct{
		Name string
	}{
		Name: "xxx",
	}
	resultData, _ := msgpack.Marshal(result)
	c.Data(200, "application/x-msgpack", resultData)
}

备注

  • gin自带的msgpack版本是1.1.7不好用,不会自动进行类型转换。 最好改用 github.com/vmihailenco/msgpack/v5

  • 替换gin中的部分接口就可以,不用全部改为msgpack

佛說大乘無量壽莊嚴清淨平等覺經pdf
净土大经科注2014-doc
此生必看的科学实验-水知道答案
印光大师十念法(胡小林主讲第1集)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值