请教 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
}
1
fishCatcher 2022 年 1 月 15 日 via iPhone
反射判断一下 json 和 struct 的 tag 哪个能匹配
|
2
shakaraka PRO 分别解析 V1 、V2 不行?你写的这个 parse 和直接调用 unmarshal 有啥区别
|
3
CodeCore 2022 年 1 月 15 日 via iPhone
转成 map ,再根据 key 的不同赋值给不同的结构体。
|
4
drackzy 2022 年 1 月 15 日
只能全部可能的 json 情况都写一遍。不像动态语言。
|
5
CEBBCAT 2022 年 1 月 15 日
有很多办法,不管是做一个超集的结构体还是逐个尝试,都是可以的。不过我想问一下,为什么要实现这个功能?拿到 []byte 之前不能确定它的类型吗?
|
6
JL1990 OP 大概了解了,先转 map ,再根据 map 字段转 struct
|
9
shakaraka PRO |
12
WilliamYang 2022 年 1 月 15 日
如何你可以控制数据的格式:
1. 可以在 json 数据里面最外层放置一个字段表明数据的格式 2. 增加 tcp 包头,表明数据类型 |
13
walleL 2022 年 1 月 15 日
@JL1990 #10
你的接口接收到的数据应该要先区分类型的吧,有一种方式是多嵌套一层 json ,比如这样定义基础结构: ```golang type Data struct { Type string `json:"type"` Body json.RawMessage `json:"type"` } ``` 这样的话你就可以先解析出 Type ,Body 还是 json 串,然后再根据 Type 将 Body 解析到对应的结构体 |
14
masterclock 2022 年 1 月 15 日
不转,用 gjson 这样的东西先取出可以识别的字段,然后根据场景:
1. 转为对应的 struct 2. 还是不转,直接变类型为某个 interface |