为了账号安全,请及时绑定邮箱和手机立即绑定

使用 `json:",string"` 返回无效使用 ,string struct 标记

使用 `json:",string"` 返回无效使用 ,string struct 标记

Go
慕姐8265434 2021-09-27 10:33:55
尝试解析具有浮点值的 json 以获取到以下结构的距离时type CreateBookingRequest struct {    Distance          float64           `json:"distance,string"`    DistanceSource    string            `json:"distanceSource"`}我收到以下错误json: 无效使用 ,string struct 标记,试图将未加引号的值解组为 [34 100 105 115 116 97 110 99 101 34]%!(EXTRA *reflect.rtype=dto.CreateBookingRequest)有没有办法让我避免错误/获得更好的错误消息?编辑: 我实际上希望 API 的用户传入一个字符串值,但如果他们出于某种原因传入一个非字符串值,我希望能够清楚地告诉他们,而不是这个难以阅读的错误消息.
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

我不得不使用有时引用数字有时不引用的 API。该服务的所有者不太可能修复它,所以我想出了一个简单的解决方法:


re := regexp.MustCompile(`(":\s*)([\d\.]+)(\s*[,}])`)

rawJsonByteArray = re.ReplaceAll(rawJsonByteArray, []byte(`$1"$2"$3`))

正则表达式有点低效,但我不相信我能够更快地实现某些东西。


查看完整回答
反对 回复 2021-09-27
?
www说

TA贡献1775条经验 获得超8个赞

错误只是说您指定Distance为带有 json 注释的字符串,但在 json 字符串中,您尝试反序列化的值没有被引用(因此不是字符串)。

解决方案很简单,将其更改json:"distance,string"json:"distance"或获取与您的定义匹配的 json(意味着它在引号中具有区别,例如"Distance":"10.4"

鉴于错误以及您的本机 Go 类型是 float64 的事实,我建议摆脱字符串注释。


查看完整回答
反对 回复 2021-09-27
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

func 解组状态:


要将 JSON 解组为结构体,Unmarshal 将传入的对象键与 Marshal 使用的键(结构体字段名称或其标签)进行匹配,更喜欢精确匹配,但也接受不区分大小写的匹配。


bool, for JSON booleans

float64, for JSON numbers

string, for JSON strings

[]interface{}, for JSON arrays

map[string]interface{}, for JSON objects

nil for JSON null

因此,float64默认情况下应该解组期望距离。但是根据标签,您要求解组到除了 Distance as string。这是缺少匹配项的数据类型。


因此,您有两个选择,要么使用float64更改距离标记,要么将距离编组为string。


查看完整回答
反对 回复 2021-09-27
  • 3 回答
  • 0 关注
  • 223 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信