怎么优雅的处理不固定的 json 内容

2023-07-03 10:56:29 +08:00
 dzdh

比如如下 json,怎么写 struct

{
"elements": [
    { "type":abc, "这个字段只在 type=abc 时出现":value},
    { "type":def, "这个字段只在 type=def 时出现":value},
    { "abc":"xx" ,"这个字段只在 abc=xx 时出现":"value"}
    ]
}
4683 次点击
所在节点    Go 编程语言
38 条回复
NessajCN
2023-07-03 11:02:25 +08:00
`json:"字段,omitempty"`
seers
2023-07-03 11:07:27 +08:00
放到 interface
xdeng
2023-07-03 11:08:19 +08:00
万能的 map[string]any
jackbrother
2023-07-03 11:11:40 +08:00
后端设计不合理
mineralsalt
2023-07-03 11:14:03 +08:00
不要映射实体了,这种情况, 还不如直接用 JsonObject 取值来的方便
bv
2023-07-03 11:14:50 +08:00
@jackbrother 确实,这个 JSON 一点也不结构化,尤其是多出来的 `"abc":"xx"` 这一项显得数据关系更加松散。
Seanfuck
2023-07-03 11:17:49 +08:00
直接结构体字段写全去解析,没有的字段好像会给个默认值吧?
yuan1028
2023-07-03 11:19:04 +08:00
struct 为了可读性,最好是把字段都写出来;
牺牲可读性,为了代码的优雅的话,可以用字符串 json 处理库 https://github.com/tidwall/gjson ,这样不用解析。
if-else 多,只能用设计模式优化。

不过,在细微逻辑处,go 还是直来直去更合适,除非业务逻辑也比较明晰。
exkernel
2023-07-03 11:24:05 +08:00
gjson +1
HelloAmadeus
2023-07-03 11:31:07 +08:00
就是 oneof 的语法,oneof 也可以理解为 optional ,设计上无外乎两种方式,一种加 type 表示类型,和你这个例子类似,另外一种就是不加 type ,按优先级取值,按你这个例子就是设计上如果存在 "这个字段只在 type=abc 时出现" 对应的值,就不会取 "这个字段只在 type=def 时出现" 这个值了。
这两种方式,无论怎么样,struct 都要把所有可能的结构都写上,都得写成
```
type Element struct {
Type string `json:"type"`
TypeABCValue *struct {
} `json:"这个字段只在 type=abc 时出现"`
TypeDEFValue *struct {
} `json:"这个字段只在 type=def 时出现"`

ABC string `json:"type"`
ABCXXValue struct {
} `json:"这个字段只在 abc=xx 时出现"`
```
ziyeziye
2023-07-03 11:37:18 +08:00
gjson +1
wangritian
2023-07-03 11:45:06 +08:00
这种 key 都不同的还好处理,全声明就完了,赞同 10 楼
gam2046
2023-07-03 12:29:12 +08:00
wheeler
2023-07-03 12:38:42 +08:00
rawMessage 根据 type 二次 unmarshal
Trim21
2023-07-03 12:41:45 +08:00
如果可能的 key 只有你提到的这 4 5 种的话,像 10 楼那样写个 struct 把所有可能的 key 都写上就好了…
SimbaPeng
2023-07-03 13:08:18 +08:00
@wheeler 审题朋友,rawMessage 只适合 key 相同的情况,楼主这是 key 都不同
Aumujun
2023-07-03 13:17:36 +08:00
gjson ? 取的时候判断一下
ccde8259
2023-07-03 13:21:50 +08:00
有的 json 包 unmarshal 出来的是 ast.Node
otakustay
2023-07-03 13:32:59 +08:00
@jackbrother 也不能说不合理吧,从类型角度考虑这就是个 union type ,要说语言的类型能力不足也行
a2231243
2023-07-03 13:53:18 +08:00
structpb.Struct 这个挺好用

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

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

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

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

© 2021 V2EX