如何解析动态类型的 json? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ntdll

如何解析动态类型的 json?

  •  
  •   ntdll 2022 年 11 月 11 日 3593 次点击
    这是一个创建于 1261 天前的主题,其中的信息可能已经有所发展或是发生改变。

    样例

    { "video": [ 1, 2, 3 ], "video": { "a": { "aa": [] } }, "video_type": "template_a" } 

    需求

    就像样例中那样,video 字段的类型有好几种,具体哪种是通过 video_type 字段决定。

    那么对于这种样子的 json ,使用 Golang 应该如何优雅的解析呢?

    (问为什么设计成样子的结构,以及解决方案是修改 json 的算了,人家已经定义好了,跑了好几年,不可能因为我改)

    18 条回复    2022-11-11 18:24:52 +08:00
    sardina
        1
    sardina  
       2022 年 11 月 11 日 via iPhone
    先写一个结构体来解析对应的 video type 然后根据不同的 type 去用不同的结构体去解析 video 字段
    或者使用一个叫 gjson 的库试试
    lisongeee
        2
    lisongeee  
       2022 年 11 月 11 日
    如果是 kotlin 可以用 密封类,如果是 typescript 可以用联合类型,如果是 go ,我不到啊
    iamzuoxinyu
        3
    iamzuoxinyu  
       2022 年 11 月 11 日
    用 DOM 风格的 json 解析库。
    virusdefender
        4
    virusdefender  
       2022 年 11 月 11 日
    先解析到只有一个字段 video_type 的 struct 上,然后判断类型后选择对应的 struct 再解析
    rrfeng
        5
    rrfeng  
       2022 年 11 月 11 日
    如果每种 video 类型的格式固定,那就好办了

    把 video 字段定义为 json.RawMessage ,然后根据 type 再进一步 Unmarshal 即可。
    Ritter
        6
    Ritter  
       2022 年 11 月 11 日
    把 video_type 对应的 struct 都枚举出来
    dzdh
        7
    dzdh  
       2022 年 11 月 11 日
    go 的话,gjson 类似的库?

    if x.Get("XX").IsArray IsFloat / x.Get("XX").Array()[0].IsFloat/IsArray
    aw2350
        8
    aw2350  
       2022 年 11 月 11 日
    gjson \ jsonparser
    Privileges
        9
    Privileges  
       2022 年 11 月 11 日
    用 gjson 解析很方便
    Crawping
        10
    Crawping  
       2022 年 11 月 11 日   1
    用 map[string]interface{} 根据 template 解析
    petercui
        11
    petercui  
       2022 年 11 月 11 日
    Jackson 的话,继承 JsonDeserializer 然后自己一个字段一个字段的解析就行了。
    yulon
        12
    yulon  
       2022 年 11 月 11 日
    Go 的 interface 和 map[string] 不是万能的?别的语言还要考虑塞个变体
    yeqown
        13
    yeqown  
       2022 年 11 月 11 日
    #5 正解,文档里的 example 和你的场景完全一致 https://pkg.go.dev/encoding/json#example-RawMessage-Unmarshal
    Great233
        14
    Great233  
       2022 年 11 月 11 日
    lisxour
        15
    lisxour  
       2022 年 11 月 11 日
    我用的 github.com/bitly/go-simplejson ,然后使用 simplejson.NewJson(bytes)反序列化,接着用 GetXXX 、SetXXX
    lisxour
        16
    lisxour  
       2022 年 11 月 11 日
    不需要定义任何结构体,可参考官方例子: https://github.com/bitly/go-simplejson/blob/master/simplejson_test.go
    sbex
        17
    sbex  
       2022 年 11 月 11 日
    pkoukk
        18
    pkoukk  
       2022 年 11 月 11 日
    先把 json decode 到 map[string]any
    然后 switch m[video_type]
    最后用 mapstructure 把 m[video] decode 到对应的 Struct
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1671 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 96ms UTC 16:20 PVG 00:20 LAX 09:20 JFK 12:20
    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