怎么看待请求参数 JSON 数据包里再包 JSON 数据

2022-10-27 10:32:03 +08:00
 Aluhao
请求数据结构如下:

{"id":"100","time":1666320790000,"validate":"cc2ac65f816faf49f7e","data":"{\"reqid\":\"\",\"taskid\":\"\",\"sid\":\"B464AA\",\"atuser\":null,\"content\":{\"type\":1,\"text\":\"{\\\"text\\\":\\\"000\\\"}\"}}"}

这样的设计大家有什么看法?
6926 次点击
所在节点    程序员
64 条回复
Rache1
2022-10-27 11:28:53 +08:00
在一些需要签名的场景,会需要用到的。

还有一些场景,假设这个 json 来自上游,有的 JSON 解析器会有全局配置,可能在别的地方给配置了,就可能会把数字字符串变成了数字,小数位为 0 的浮点数转成了整数,等等。

还有比如 PHP 里面的 json_decode ,大部分人会习惯性的给第二个参数添加一个 true , 以返回一个 PHP 的数组,方便使用,而这种情况就最容易出问题的就是,某个字段的值,如果对方放回的是一个空的对象 {},经过 php 这样一转换,就成了 [] 了,当然这些都是人为因素。

jowan
2022-10-27 11:29:46 +08:00
你这还好 只是接收 多解析一层就行了
我对接的腾讯、快手、巨量、VO 厂的广告投放平台
TMD 提交数据的时候 JSON 里面有个 WHERE 条件必须是 JSON 字符串
极其丑恶
yannxia
2022-10-27 11:33:01 +08:00
这里有两种可能
- data 里面是规定格式的,这就是菜
- data 里面是多态格式的,类型一直在变,对于强类型的语言处理不好,只能用 String 接(虽然 Jackson 有 Type 字段,但是会要求前端传入),这种就是 workaround 没办法。
Felldeadbird
2022-10-27 11:39:31 +08:00
一般来说是设计和迭代上出问题了。 刚开始一个 json 。后面对接多一个接口的数据,他是 json 的。编码的人图省事没整理原路传递下去。
bollld607
2022-10-27 11:55:04 +08:00
chimission
2022-10-27 13:06:54 +08:00
我觉得把出现这种情况不可怕, 可能是历史迭代的问题,但是后面不想着把它改掉继续能用就行我觉得有点不可接受
preach
2022-10-27 13:14:20 +08:00
历史遗留问题 大概率
dcsuibian
2022-10-27 13:26:11 +08:00
我干过这事,不过具体场景有差别。
是因为数据库里面这个实体的存储形式就是 JSON 。至于数据库字段为啥要用 JSON ,因为这个字段里的内容太复杂多变了。同样的,如果建立实体类,实体类本身也会常变。因此后端就不转化直接传给前端了,反正前端是动态语言,内置 JSON.parse 方便。
尤其是一些显示效果、和后端运行无关的。后端做个大概得验证就好了。
JohnBull
2022-10-27 13:34:24 +08:00
"我要用 JSON,但就是不愿意用最自然的姿势用 JSON,我气死我自己."

也碰到过类似场景,为防止瞎眼,我直接要求 string 必须 base64
zhhqiang
2022-10-27 13:39:53 +08:00
沟通到位就没问题
russ44
2022-10-27 13:42:27 +08:00
如果是自家的后端可以让他处理一下
onikage
2022-10-27 14:23:21 +08:00
外层 validate 字段是干什么的?
如果是 data 是需要校验的话, 这种挺好, 否则还得为每种业务单独定义个顺序,
这种可以把 data 里面的业务和外层的 validate 校验解耦合, 不需要定义大量的字段顺序.
feller
2022-10-27 14:26:57 +08:00
微博就是这样的,b 战也是。
Aluhao
2022-10-27 14:40:21 +08:00
@onikage validate 签名验证,这个是去向 API 请求的数据包,不是响应数据,如果是响应数据倒没关系,有需要就解出来,没有需要就抛去。
mtdhllf
2022-10-27 14:42:12 +08:00
如果包的 json 它的结构是变化的话,可以理解
ratazzi
2022-10-27 14:57:11 +08:00
多半是为了签名排序,有些人就是不肯直接对 body 签名放在 header ,要排序然后还要各种拼接,写的不累吗
mringg
2022-10-27 15:01:06 +08:00
手工造数据比较麻烦
edis0n0
2022-10-27 15:03:23 +08:00
又不是不能用
wolfie
2022-10-27 15:45:10 +08:00
@lessMonologue
第一反应都是那
{
key: {
"inner-key": "value"
}
}

上面喷的都是
{
key: "{\"inner-key\": \"value\"}"
}
aofall
2022-10-27 15:48:53 +08:00
1.反序列化排序问题
2.数据字段、内容不固定,没有设计专门的字段存储而是靠 varchar 或者 json 存在数据库( MySQL )中
3.历史问题

碰到 2 、3 这种情况倒也不是不能弄,多一步处理( Java ):定个 Vo 处理这个字段,用 Jackson 反序列化把这个字段转 Map 就行。

2 这种情况在所谓的“低代码”、“动态表单”之类的平台很常见

至于上面说“菜”的,你就说能不能用吧,前端或者后端总有一个人要多写点代码做这种处理的,不是菜,而是有人想偷懒🤣

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/890284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX