如何将[]接口转换为[]字符串,或者只是将[]接口中的所有元素转换为连接的单个字符串?下面是显示“范围”的确切值的屏幕截图,其中类型[]接口的长度为2.在下面的代码中,大小写为“slice”目前我正在使用反射但这看起来不太好。想知道应该有一些很好的方法来加入一个切片\接口元素数组。
我也尝试过使用json unmarshall这样的“json.Unmarshal([] byte(jwtResp),& mymap)”但在将jwt.MapClaims转换为byte []
时遇到类型问题。parsedkey, _ := jwt.ParseRSAPublicKeyFromPEM([]byte(key))
parsedToken, jwtErr := jwt.Parse(bearerToken, func(token *jwt.Token) (interface{}, error) {
return parsedkey, nil
})
jwtValues = make(map[string]string)
// we dont know which data types we are dealing with here, so using swtich case based on value data type
jwtResp := parsedToken.Claims.(jwt.MapClaims)
for k, v := range jwtResp {
switch reflect.TypeOf(v).Kind() {
case reflect.Slice:
fmt.Println("tp is : ", reflect.TypeOf(v)) // this is []interface{}
fmt.Println("type is : ", reflect.TypeOf(v).Kind()) // this is slice
s := reflect.ValueOf(v)
for i := 0; i < s.Len(); i++ {
jwtValues[k] += s.Index(i).Interface().(string)
jwtValues[k] += "|"
}
case reflect.String:
jwtValues[k] = v.(string)
default:
fmt.Println("unknown datatype")
}
}
答案 0 :(得分:1)
感谢您的建议。下面是我发现用“if”条件替换“switch”以及类型断言的最接近的解决方案。 '反思'代价高昂。使用下面的代码,我发现jwtResp
的值是切片,字符串还是其他东西。如果是slice,则遍历值(带有字符串类型元素的[]接口)并将它们作为一个连接字符串连接起来。
for k, v := range jwtResp {
if s, ok := v.(string); ok {
JwtValues[k] = s
} else if s, ok := v.([]interface{}); ok {
sslice := make([]string, len(s))
for i, v := range s {
sslice[i] = v.(string)
}
JwtValues[k] = strings.Join(sslice, "|")
} else {
logger.Log(util.LogDebug, "unknown data type")
}
}
答案 1 :(得分:0)
不确定是否完全理解了您的问题,但似乎您已走上正轨。
parts := make([]string, s.Len())
for i := 0; i < s.Len(); i++ {
parts = append(parts, s.Index(i).String())
}
jwtValues[k] = strings.Join(parts, "|")