上游传递不确定 的json ,如何透传给下游业务?
比如 我解析参数
{
"test": 1,
"key": {
"k1": "1",
"k2": 2
}
}
但是key 结构体下面是未知的。可能是K1 K2 K3 ... KN
如何解析传递那?
上游传递不确定 的json ,如何透传给下游业务?
比如 我解析参数
{
"test": 1,
"key": {
"k1": "1",
"k2": 2
}
}
但是key 结构体下面是未知的。可能是K1 K2 K3 ... KN
如何解析传递那?
使用 map[string]interface{}
配合类型断言使用
如下:
type js struct {
Test string `json:"test"`,
Key map[string]interface{} `json:"key"`
}
var jss js
if err := json.Unmarshal([]byte(jsonstr), &jss); err != nil {
panic(err)
}
在使用
switch v.(type){
case int:
pass
}
2 回答2.4k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答1.2k 阅读
1 回答1.8k 阅读
类似的问题我回答过好几次了,这个问题真的是经常有人问啊。
对于 json 格式数据的解析,如果其中的某个成员结构不确定,我总结一般有几种方式处理。
第一种,最容易想到的就是,将那个不确定的成员用 map[string]interface{} 替代。其他人的回答都提到了,怎么操作就不赘述了。但问题是,这种方式太坑,每次都要做类型断言,还要检查一次是否 ok,真的是太坑。
第二种,既然 map[string]interface{} 的方式太坑,那如果要是能用结构体就好了,虽然其中某个成员的结构不确定,但如果共性字段比较多,比如都是与人相关,那肯定都有名字,年龄之类的字段,但如果是教师和学生,就会有一些不同的字段,把所有的不同字段都包含进来即可。但如果不同字段太多,那也不是很方便。
第三种,终极解决方案,如果能先解析第一层的结构,再根据第一层的结果,确定第二层的结构,那就方便多了。不确定的成员依然用 map[string]interface{} 表示,确定结构后,再将 map[string]interface{} 解析为具体的某个结构。结构体使用起来就方便很多了。
问题最终就变成了如何将 map[string]interface{} 转化为 struct,这个过程必然会用到反射,可以自己实现。但其他人早造就想到了,一个第三方库,地址:https://github.com/mitchellh/... 。
之前写过一篇文章,和这个问题相关,建议去看看,Go 中实例演示 json 的 map 和 struct 便捷处理转化,里面简单介绍了 mapstructure 的使用。