
{ "video": [ 1, 2, 3 ], "video": { "a": { "aa": [] } }, "video_type": "template_a" } 就像样例中那样,video 字段的类型有好几种,具体哪种是通过 video_type 字段决定。
那么对于这种样子的 json ,使用 Golang 应该如何优雅的解析呢?
(问为什么设计成样子的结构,以及解决方案是修改 json 的算了,人家已经定义好了,跑了好几年,不可能因为我改)
1 sardina 2022 年 11 月 11 日 via iPhone 先写一个结构体来解析对应的 video type 然后根据不同的 type 去用不同的结构体去解析 video 字段 或者使用一个叫 gjson 的库试试 |
2 lisongeee 2022 年 11 月 11 日 如果是 kotlin 可以用 密封类,如果是 typescript 可以用联合类型,如果是 go ,我不到啊 |
3 iamzuoxinyu 2022 年 11 月 11 日 用 DOM 风格的 json 解析库。 |
4 virusdefender 2022 年 11 月 11 日 先解析到只有一个字段 video_type 的 struct 上,然后判断类型后选择对应的 struct 再解析 |
5 rrfeng 2022 年 11 月 11 日 如果每种 video 类型的格式固定,那就好办了 把 video 字段定义为 json.RawMessage ,然后根据 type 再进一步 Unmarshal 即可。 |
6 Ritter 2022 年 11 月 11 日 把 video_type 对应的 struct 都枚举出来 |
7 dzdh 2022 年 11 月 11 日 go 的话,gjson 类似的库? if x.Get("XX").IsArray IsFloat / x.Get("XX").Array()[0].IsFloat/IsArray |
8 aw2350 2022 年 11 月 11 日 gjson \ jsonparser |
9 Privileges 2022 年 11 月 11 日 用 gjson 解析很方便 |
10 Crawping 2022 年 11 月 11 日 用 map[string]interface{} 根据 template 解析 |
11 petercui 2022 年 11 月 11 日 Jackson 的话,继承 JsonDeserializer 然后自己一个字段一个字段的解析就行了。 |
12 yulon 2022 年 11 月 11 日 Go 的 interface 和 map[string] 不是万能的?别的语言还要考虑塞个变体 |
13 yeqown 2022 年 11 月 11 日 #5 正解,文档里的 example 和你的场景完全一致 https://pkg.go.dev/encoding/json#example-RawMessage-Unmarshal |
14 Great233 2022 年 11 月 11 日 |
15 lisxour 2022 年 11 月 11 日 我用的 github.com/bitly/go-simplejson ,然后使用 simplejson.NewJson(bytes)反序列化,接着用 GetXXX 、SetXXX |
16 lisxour 2022 年 11 月 11 日 不需要定义任何结构体,可参考官方例子: https://github.com/bitly/go-simplejson/blob/master/simplejson_test.go |
17 sbex 2022 年 11 月 11 日 |
18 pkoukk 2022 年 11 月 11 日 先把 json decode 到 map[string]any 然后 switch m[video_type] 最后用 mapstructure 把 m[video] decode 到对应的 Struct |