我从远程源读取JSON数据并将其转换为地图。我想要检查字符串值的数据中有一些数组。转换后,我认为m [" t"]是一个接口数组。 fmt.Print将其转换为控制台上的打印文本,但我无法想办法进行简单的字符串比较,如
if val[0] == "str-c" {fmt.Println("success")}
如何迭代并进行字符串比较?
package main
import (
"fmt"
"encoding/json"
)
func main() {
var m map[string]interface{}
sJSON := `{"k": "v", "t":["str-a","str-b","str-c"]}`
_ = json.Unmarshal([]byte(sJSON),&m)
// find out if one of the string values of "t" is "str-b"
fmt.Println(m["t"])
}
答案 0 :(得分:7)
m["t"]
的类型为interface{}
并且是完整的数组,如果你想让str-b
它在索引1,你必须做一些类型断言才能将它作为一个串。这是一个例子; https://play.golang.org/p/W7ZnMgicc7
如果你想在集合中检查它,看起来像这样;
package main
import (
"fmt"
"encoding/json"
)
func main() {
var m map[string]interface{}
sJSON := `{"k": "v", "t":["str-a","str-b","str-c"]}`
_ = json.Unmarshal([]byte(sJSON),&m)
// find out if one of the string values of "t" is "str-b"
for _, v := range m["t"].([]interface{}) {
if v.(string) == "str-b" {
fmt.Println("match found!")
}
}
//fmt.Println(m["t"].([]interface{})[1].(string))
}
https://play.golang.org/p/vo_90bKw92
如果你想避免这种“拆箱”的东西,我建议你这样做,你可以改为定义一个解组的结构,它看起来像这样;
type MyStruct struct {
K string `json:"k"`
T []string `json:"t"`
}
然后你可以在没有任何类型断言的情况下超出T
的范围,并在这里进行比较,工作示例; https://play.golang.org/p/ehPxOygGf5