动态 JSON 序列化对强类型语言很难吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
SoulFlame

动态 JSON 序列化对强类型语言很难吗?

  •  
  •   SoulFlame 1 天前 1343 次点击
    接口返回一个 json 字符串,里面的字段是动态的,客户端只需要序列化后,原样传递给第三方接口。
    IOS 端的,开始和他沟通死活说做不到,他必须要知道有什么字段,里面的键固定的他才有办法接收,他说强类型语言就这样。
    我表示 golang 也是强类型语言,也可以做得到啊,不存在强类型语言做不到。然后我去问 AI IOS 开发动态 JSON 序列化,起码能给出 4 种解决方案写法。所以坚持要他想办法实现。
    后来他实现了,问他强类型语言能不能做到也不吱声了。
    32 条回复    2026-04-24 21:31:52 +08:00
    yzbzz
        1
    yzbzz  
       1 天前
    不是难,是麻烦。要写一堆逻辑
    shakaraka
        2
    shakaraka  
    PRO
       1 天前
    golang 也不见得可以啊,你觉得可以,那是因为有人干了脏活累活
    SoulFlame
        3
    SoulFlame  
    OP
       1 天前
    @shakaraka #2 我可以明确告诉你可以,我已用 golang 实现了
    shakaraka
        4
    shakaraka  
    PRO
       1 天前
    @SoulFlame #3 好奇。看看?
    JoeJoeJoe
        5
    JoeJoeJoe  
    PRO
       1 天前
    你是 PHP 做的后台接口吗?

    之前遇过类型是{}, 因为结果是空的, 返回了一个[], 这个你要是让客户端来处理大概有点说不过去.

    ps: 字段动态+类型动态在原生看来真的很折磨 出了问题都赖客户端没适配好
    ty29022
        6
    ty29022  
       1 天前
    我没看懂, 原样传递要序列化做什么? “接口返回一个 json 字符串”这不就是序列化的结果?
    niubilewodev
        7
    niubilewodev  
       1 天前
    可以,就是一直被吐槽的 map 一把梭。
    SoulFlame
        8
    SoulFlame  
    OP
       1 天前
    @JoeJoeJoe #5 和你说的这个没有关系,不涉及{}和[]。仅涉及 json 串里面会增多减少字段
    adoal
        9
    adoal  
       1 天前   1
    首先,我猜你想说的是“静态类型语言”。因为哪怕 Python 都算是强类型语言。

    其次,有运行时类型自省机制的静态类型语言里照样也有 object/any/...等表示“没运行到现场时不确定”的类型。

    再次,JSON 这么简单的数据格式,一共就 3 种原子类型和 2 种复合类型。

    最后,JSON 这么成熟的技术,主流编程语言早就有久经考验的库支持了,又不用从头撸(就算从头撸工作量也不是很大)。
    SoulFlame
        10
    SoulFlame  
    OP
       1 天前
    @ty29022 #6 或者严谨点说法,应该叫反序列化?
    adoal
        11
    adoal  
       1 天前
    结论,那个人就是不想干。
    changdy
        12
    changdy  
       1 天前
    如果客户端不需要操作的话 那太简单了.

    直接用字符串接受.然后原样再发给第三方.

    但是这种交互方式好像有点奇怪..
    beidounanxizi data-uid=
        13
    beidounanxizi  
       1 天前
    2 个都不懂序列化和反序列化吧 就是个 map 存储完 类型判断而已 哪有这么多废话 他不想写的原因是 这锅 不想扣到他自己头上 他接受 就代表可以接受你任何 json 他都能处理
    是我 也不想 对于 IOS 他拿到一个不是确定的 对于他 UI 展示 没鸡毛帮助
    dumbass
        14
    dumbass  
       1 天前
    JSON.parse() 一把梭
    SoulFlame
        15
    SoulFlame  
    OP
       1 天前
    @changdy #12
    @beidounanxizi #13 不需要对字段内容进行操作,也没有 UI 展示。单纯的是反序列回来,作为 body 参数,请求第三方 API 就行
    94
        16
    94  
       1 天前
    @SoulFlame #15 ,我的想法和#12 、#13 一样,感觉不想背锅的原因。
    如果额外传输的内容有问题,从外部第三方来看源头就是 iOS 端。会先找到他,然后他再找到你。和你扯皮我觉得是想留下沟通记录,到时候出问题好甩锅给你。
    beidounanxizi
        17
    beidounanxizi  
       1 天前
    @SoulFlame 那你告诉他 直接用 map 直接存就好了 不需要任何处理
    感觉是沟通问题 不如告诉他 序列化成 map 就行了 或者直接给他 swift 代码得了
    xtreme1
        18
    xtreme1  
       1 天前
    强/弱类型本身就不是一个良定义的概念, 拿这东西出来说事已经没必要和他讨论其它的了
    evilHa
        19
    evilHa  
       1 天前
    都 AI 编程时代了,咋还纠结这个,让 AI 写不就行了。

    本质是没有现成的东西或者他不会,他不想解决。
    woodfizky
        20
    woodfizky  
       1 天前
    有种我刚入行时候菜鸡互啄的感觉。。
    首先那叫反列化,把 JSON 字符串转成各个语言/框架对应的对象。
    把对象转成 JSON 字符串那才叫序列化。

    跟是不是强类型没关系,反序列化之后什么语言基本都会有一个最基础的对象。
    就算语言本身没有自带 JSON 序列化相关工具,那也会有相关的第三方包可以做这事情。

    只是看开发用什么框架、什么对象去再进一步承载这个 json 反序列化之后的。
    IOS 不清楚,拿 Python 举例,就比如请求体是 JSON ,Web 框架是 FastAPI ,可以直接支持 JSON 反序列化为 pydantic 对象,过程中还会自然而然地对每个值做 validation ,还能自定义 validator 。

    你如果刚入行,对方也是刚入行,那大家都是菜鸟,在菜鸡互啄中成长,很正常。
    但是你们俩谁要是不是刚入行的那就得反思了。
    zuokanyunqishi
        21
    zuokanyunqishi  
       1 天前
    @JoeJoeJoe 如果约定的不是 json 数组结构,是 json 对象,就返回 stdClass 啊 ,这个格式化 json 后就是 {};
    JoeJoeJoe
        22
    JoeJoeJoe  
    PRO
       1 天前
    @zuokanyunqishi 不是 我说的是我之前碰到过的一种情况, 就是 PHP 那边空对象好像返回的是个空数组

    op 碰到的这种情况可能就是我 ps 里面写的, 怕被甩锅. 因为第三方接收参数如果没什么限制的话, 其实一个 dic 对象就能反序列化传过去, 如果第三方要求对应的数据模型的话, 才会有一些特殊处理.
    jonty
        23
    jonty  
       1 天前
    @SoulFlame #10 还是没看懂,反序列化了后再序列化成原来样子的 string 给出去?
    SoulFlame
        24
    SoulFlame  
    OP
       1 天前
    @jonty #23 需要反序列化是因为第三方接口不接受 json 传参,接收 Content-Type:application/x-www-form-urlencoded
    SoulFlame
        25
    SoulFlame  
    OP
       1 天前
    @zuokanyunqishi #21
    @JoeJoeJoe #5 你说的这个是另一个前后端协作问题,和本文无关。
    PHP 我也写,多年协作生涯中也遇过你描述的这个问题,所以我现在搭的框架,基础控制器里面都是这样统一转化的,上代码:
    SoulFlame
        26
    SoulFlame  
    OP
       1 天前
    @SoulFlame #25
    $output = [
    'code' => $code,
    'msg' => $message,
    'data' => $data ?: new \stdClass(),
    ];
    Building
        27
    Building  
       1 天前
    @woodfizky Swift 官方的反序列化框架只是一种协议,并不存在基础对象,说实话感觉 OP 并不理解反序列化的具体意思,反序列化主要作用还是方便自己使用.语法,反不反序列化又有什么关系呢,除非使用的第三方 framework 必须用到对象,那自己生成绑定一下也可以了,以前 OC 对象是可以动态生成对象属性的而且对.语法有特殊处理,Swift 肯定是做不到的,也就是说没有提前定义好,任意 json 对象例如 'person': { 'age': '18' } 那肯定是反序列不了成 Swift.Person.age 的
    LHN
        28
    LHN  
       1 天前
    ai 时代还在纠结技术实现就不可取
    SoulFlame
        29
    SoulFlame  
    OP
       1 天前
    @Building #27 首先我明白反序列化的意思。然后我可以很明确的告诉你客户端需要反序列化,因为服务端给的是一串 JSON 字符串,而客户端需要调用的第三方 API 不接受 JSON 字符串,接收 Content-Type:application/x-www-form-urlencoded 。
    至于你后面说的 Swift 语言里面的东西,我不了解该语言就不发表意见了。
    最后,还是如我开始说的,客户端已经实现该功能了,至于他怎么做到的,我已不关心了,不是我负责的部分。
    SoulFlame
        30
    SoulFlame  
    OP
       1 天前
    @LHN #28 咋说呢,其实谁都有第一次做某个需求或者接触新技术的时候,作为技术,在没有明确论证过之前,可以说比较困难,或者需要时间尝试。但像我上面说的那个需求,沟通中没有去求证,自己没有经历过就直接回复说做不了、做不到,我觉得是不负责任的
    strobber16
        31
    strobber16  
       22 小时 9 分钟前 via Android
    类型警察,出警
    nightwitch
        32
    nightwitch  
       9 小时 9 分钟前
    接口连 schema 都定不下来我也不接,谁知道里面会有什么东西,搞不好说不定有 emoji 在里面。上游拉屎很方便,调接口的人接下来以后无穷无尽的 bug 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     942 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 85ms UTC 22:41 PVG 06:41 LAX 15:41 JFK 18:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86