不幸的是,
json软件包没有提供真正的自动解决方案。
但是您可以将依赖项解组为a
map[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 functionfor _, 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 }}


