Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

浮点型 JSON 序列化小坑点! #32

Open
RedCrazyGhost opened this issue Nov 24, 2024 · 0 comments
Open

浮点型 JSON 序列化小坑点! #32

RedCrazyGhost opened this issue Nov 24, 2024 · 0 comments
Labels
Golang fa-brands fa-golang

Comments

@RedCrazyGhost
Copy link
Owner

最近辛勤耕耘代码时,遭遇了一件始料未及的状况。
向日志中间件发送请求时,控制台时不时冒出报错信息。这可让我警觉起来,心里直犯嘀咕:“这是何方妖孽再次作怪,让我前去捉拿归案!”
起初粗看请求,地址、路由、方法以及结构体,各个要素都毫无二致。待我沉下心、仔细审视请求返回提示,终于发现了些许 “蛛丝马迹”—— 返回结果提示传入类型不匹配。当时,我不禁脱口而出 “啊!~”,满是诧异。
一番细致比对后,症结浮出水面:代码里明明定义的是 float64 类型,解析结果却成了整数,这着实不合理。带着满心疑惑,我上网查阅资料,原来是因为 JSON 并不区分整数与小数,统统视作 Number 类型,才导致好好的浮点型数据输出成了整型,这可不是我想要的结果。
为解决这一棘手问题,我在程序猿交友网站高强度冲浪🏄。结果发现,不管是Golang自带的encoding/json,还是ByteDance的bytedance/sonic,针对浮点类型都没有对应的配置与额外处理手段,我不禁心生疑问:难道这算是小众需求?内心产生大大的❓
面对这般情形,摆在眼前有两条路:一是自定义类型来处理序列化;二是重写代码,让其支持浮点类型的序列化。考虑到项目里大量使用浮点型数据,我毅然选了后者,却没料到,“折磨” 就此拉开帷幕。
我着手手写Marshal处理方法,上来便按部就班展开操作:先是获取reflect.Type、reflect.Value以及reflect.StructField.Tag,紧接着处理Tag内容、匹配基础类型,各个环节一气呵成。尤其针对浮点类型的json输出文本,我特意做了单独处理,只要数据没有小数部分,就添加上.0,以此确保json文本里的Number类型能被正确识别为浮点型。完成编写后,跑测试用例,嘿,一次性通过,生成的json文本也符合预期,当时满心欢喜,立马进行 git 三连操作(add、commit、push)
然而,好景不长。随着项目推进,结构体里不仅要处理 time.Time 类型,还涉及诸多其他复杂类型。我那手写、维护并不周全的Marshal方法,渐渐显得力不从心,维护难度愈发攀升。日复一日,我在这 “泥潭” 里挣扎,直至精疲力竭,实在无力继续维护,无奈之下,只好调整回使用原生 encoding/json 搭配自定义类型的方式处理序列化,至此,这场 “折腾” 才算画上句号。

@RedCrazyGhost RedCrazyGhost added the Golang fa-brands fa-golang label Nov 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Golang fa-brands fa-golang
Projects
None yet
Development

No branches or pull requests

1 participant