golang 中 json 如何解析不同的结构体

2022-01-15 20:02:31 +08:00
 JL1990

请教 V 站的大帅 b ,如下代码举例,函数中如何根据传入的不同类型字符串,解析成对应的结构体呢?有没有相关代码可以参考学习的。

jsonText1 := "{\"name\":\"jack\"}"
jsonText2 := "{\"age\": 13}"

type V1 struct {
	Name string	`json:"name"`
}
type V2 struct {
	Age int	`json:"age"`
}

func parse(jsonString string) (i interface{}) {
	if err := json.Unmarshal([]byte(jsonText1), &i); err != nil {
		panic(err)
	}
	return
}
1587 次点击
所在节点    问与答
14 条回复
fishCatcher
2022-01-15 20:24:44 +08:00
反射判断一下 json 和 struct 的 tag 哪个能匹配
wunonglin
2022-01-15 20:24:45 +08:00
分别解析 V1 、V2 不行?你写的这个 parse 和直接调用 unmarshal 有啥区别
CodeCore
2022-01-15 20:28:33 +08:00
转成 map ,再根据 key 的不同赋值给不同的结构体。
drackzy
2022-01-15 21:26:52 +08:00
只能全部可能的 json 情况都写一遍。不像动态语言。
CEBBCAT
2022-01-15 21:28:43 +08:00
有很多办法,不管是做一个超集的结构体还是逐个尝试,都是可以的。不过我想问一下,为什么要实现这个功能?拿到 []byte 之前不能确定它的类型吗?
JL1990
2022-01-15 21:35:37 +08:00
大概了解了,先转 map ,再根据 map 字段转 struct
JL1990
2022-01-15 21:37:34 +08:00
@CEBBCAT #5 我的流程是,收到的这些不同字符串,我想转换成对应的结构体,再做相应的处理。
CEBBCAT
2022-01-15 21:43:54 +08:00
@JL1990 #7 为什么会有不同类型的数据呢?
wunonglin
2022-01-15 22:03:42 +08:00
@JL1990 #7 那为什么不把字段都做在一个 struct ,然后再判断那些有值不就行了么?

https://s2.loli.net/2022/01/15/4f1JIzoFEKeDp8g.png
JL1990
2022-01-15 22:18:44 +08:00
@CEBBCAT #8 我做的是一个公共数据接口,tcp 协议,端口会接收不同的 json 数据字符串,所以对应有不同的数据格式。
JL1990
2022-01-15 22:19:55 +08:00
@wunonglin #9 嗯嗯,学到了,你这也是一种方式,感谢指导。
WilliamYang
2022-01-15 23:15:24 +08:00
如何你可以控制数据的格式:
1. 可以在 json 数据里面最外层放置一个字段表明数据的格式
2. 增加 tcp 包头,表明数据类型
walleL
2022-01-15 23:21:49 +08:00
@JL1990 #10
你的接口接收到的数据应该要先区分类型的吧,有一种方式是多嵌套一层 json ,比如这样定义基础结构:
```golang
type Data struct {
Type string `json:"type"`
Body json.RawMessage `json:"type"`
}
```

这样的话你就可以先解析出 Type ,Body 还是 json 串,然后再根据 Type 将 Body 解析到对应的结构体
masterclock
2022-01-15 23:23:03 +08:00
不转,用 gjson 这样的东西先取出可以识别的字段,然后根据场景:
1. 转为对应的 struct
2. 还是不转,直接变类型为某个 interface

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

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

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

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

© 2021 V2EX