1 回答
TA贡献1828条经验 获得超13个赞
不幸的是,该软件包没有为此提供真正的自动解决方案json。
但是您可以将依赖项解组为 amap[string]*json.RawMessage而不是map[string]string. json.RawMessage只是一个[]byte,因此您可以根据第一个字节来决定消息的类型。
例子:
for _, value := range dependencies {
depVal := map[string]*json.RawMessage{}
_ = json.Unmarshal(*value, &depVal)
// check if the first character of the RawMessage is a bracket
if rune([]byte(*depVal["licenses"])[0]) == '[' {
var licenses []string
json.Unmarshal(*depVal["licenses"], &licenses)
fmt.Println(licenses)
// do something with the array
}
result = append(result, Dependency{
URL: string(*depVal["repository"]),
License: string(*depVal["licenses"]),
})
}
另一种解决方案是使用 2 个结构。一个包含字符串形式的依赖项,另一个包含数组形式的依赖项。然后您可以尝试json.Unmarshal同时调用它们。例子:
type Dependency struct {
Licenses string
// other fields
}
type DependencyWithArr struct {
Licenses []string
// other fields
}
// in your function
for _, value := range dependencies {
type1 := Dependency{}
type2 := DependencyWithArr{}
err = json.Unmarshal(*value, &type1)
if err != nil {
err = json.Unmarshal(*value, &type2)
// use the array type
} else {
// use the single string type
}
}
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报