怎么优雅的处理不固定的 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"}
    ]
}
4685 次点击
所在节点    Go 编程语言
38 条回复
janus77
2023-07-03 13:56:20 +08:00
这种内容,一般上游是 php ,要么就是这个项目的老架构是用 php 后面改 go 重写的
mxT52CRuqR6o5
2023-07-03 13:57:52 +08:00
abc 这个 key 是动态的?
dzdh
2023-07-03 14:55:47 +08:00
@mxT52CRuqR6o5 其他也是动态的。后端是 php 类似 class TypeA impl jsonserialize { tojson: return [type:...
Justin13
2023-07-03 16:54:21 +08:00
上 jsonschema
lisxour
2023-07-03 16:58:42 +08:00
这种就不应该上结构体了,用 gjson 之类的去取
CloveAndCurrant
2023-07-03 17:01:52 +08:00
推荐 fastjson: github.com/valyala/fastjson
和 fasthttp 一个作者开发的
shawn4me
2023-07-03 17:06:57 +08:00
我之前做需求开发的时候也遇到这种动态字段的问题。我通常的做法是:类型作为一个字段,跟着类型变动的其他字段使用 json 字段统一存在一个字段里面。形成一个两级关系,这样就可以放心根据 type 字段进行取用了。Go 用内嵌应该也能做到,再加一个 omitempty 就能避免无用字段出现了。
bunny189
2023-07-03 19:27:40 +08:00
我个人评价为你们后端有病
lisongeee
2023-07-03 19:55:25 +08:00
如果是 typescript/scala 的话,就是一个很简单的 联合类型
sadfQED2
2023-07-03 20:18:13 +08:00
直接上正则吧,别解析了
huzhizhao
2023-07-03 23:56:09 +08:00
不知道什么类型的业务会不抽象🤔
alexapollo
2023-07-04 00:20:38 +08:00
条件结构的需求非常常见。比如不同返回码对应了不同的输出 —— 在上古 C 语言时期就已经有大量对应设计。

如: http://c.biancheng.net/view/2035.html 中有 C 语言的 union 例子

在 Python 中,你可以使用支持 Union 类型的库来实现这个功能,比如 pydantic: https://docs.pydantic.dev/latest/usage/types/unions/

在其他语言中,你也应该搜索:<lang> json union ,来找到一个恰当的实现
Leviathann
2023-07-04 00:27:47 +08:00
数组里后面的元素依赖前面的元素的 type 字段?
什么勾把接口
cheng6563
2023-07-04 09:23:34 +08:00
@huzhizhao PHP 后台能给你个 JSON 已经很不错了
rs9G7IrdOdiNR3h1
2023-07-04 09:57:02 +08:00
使用 com.google.gson.JsonDeserializer
troywinter
2023-07-04 17:16:38 +08:00
明显结构设计不合理
huzhizhao
2023-07-05 06:47:19 +08:00
@cheng6563 确实,深有体会
awanganddong
2023-07-13 14:11:57 +08:00
这个帖子是一个解决方案
Go 如何解析 json 内部结构不确定的情况

https://my.oschina.net/u/4628563/blog/4724059

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

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

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

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

© 2021 V2EX