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

尝试解析具有浮点值的 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 的用户传入一个字符串值,但如果他们出于某种原因传入一个非字符串值,我希望能够清楚地告诉他们,而不是这个难以阅读的错误消息.


慕姐8265434
浏览 276回答 3
3回答

天涯尽头无女友

我不得不使用有时引用数字有时不引用的 API。该服务的所有者不太可能修复它,所以我想出了一个简单的解决方法:re := regexp.MustCompile(`(":\s*)([\d\.]+)(\s*[,}])`)rawJsonByteArray = re.ReplaceAll(rawJsonByteArray, []byte(`$1"$2"$3`))正则表达式有点低效,但我不相信我能够更快地实现某些东西。

www说

错误只是说您指定Distance为带有 json 注释的字符串,但在 json 字符串中,您尝试反序列化的值没有被引用(因此不是字符串)。解决方案很简单,将其更改json:"distance,string"为json:"distance"或获取与您的定义匹配的 json(意味着它在引号中具有区别,例如"Distance":"10.4")鉴于错误以及您的本机 Go 类型是 float64 的事实,我建议摆脱字符串注释。

慕姐4208626

func 解组状态:要将 JSON 解组为结构体,Unmarshal 将传入的对象键与 Marshal 使用的键(结构体字段名称或其标签)进行匹配,更喜欢精确匹配,但也接受不区分大小写的匹配。bool, for JSON booleansfloat64, for JSON numbersstring, for JSON strings[]interface{}, for JSON arraysmap[string]interface{}, for JSON objectsnil for JSON null因此,float64默认情况下应该解组期望距离。但是根据标签,您要求解组到除了 Distance as string。这是缺少匹配项的数据类型。因此,您有两个选择,要么使用float64更改距离标记,要么将距离编组为string。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go