我正在使用http.Get转到一个url,结果如下 {"名称":"卡桑德拉""标记":[" 2.2.6""最新"]}这意味着它的行为类似于name字段的map [string]字符串,但在标签中它的行为类似于map [string] []字符串,那么如何在Go中解组呢? 我尝试使用map [string] []字符串,但它不起作用
map_image_tags := make(map[string][]string)
res2, err := http.Get(fmt.Sprintf("%s/v2/%s/tags/lists", sconf.RegistryConf.url, Images[i]))
if err != nil {
w.WriteHeader(500)
log.Errorf("could not get tags: %s", err)
return
}
log.Debugf("OK")
js2, err := ioutil.ReadAll(res2.Body)
if err != nil {
w.WriteHeader(500)
log.Errorf("could not read body: %s", err)
return
}
log.Debugf("OK")
err = json.Unmarshal(js2, map_image_tags)
if err != nil {
w.WriteHeader(500)
log.Errorf("could not unmarshal json: %s", err)
return
}
我收到此日志错误:无法解组json:无效字符' p'在顶级值之后
答案 0 :(得分:2)
要读取像{"name":"cassandra", "tags":["2.2.6","latest"]
这样的json值,可以使用定义为:
type mapImageTags struct {
Name string `json:"name"`
Tags []string `json:"tags"` // tags is a slice (array) of strings
}
要解组JSON数据,
m := mapImageTags{}
err = json.Unmarshal(js2, &m)
在这种情况下,一个简单的map[string]string
不会有帮助。
答案 1 :(得分:1)
请尝试map[string]interface{}
,请注意此方法强制任何数字为float
,并且一般不建议在json复杂时使用。 abhink的答案是推荐的方式。
答案 2 :(得分:1)
如果json数据的结构是动态的,您可以将tags
解组为map[string]interface{}
:
var encodedTags map[string]interface{}
result := json.Unmarshal([]byte(image_tags), &encodedTags)
然后您可以使用类型断言来解组tags
:
var tags []interface{}
result = json.Unmarshal([]byte(encodedTags["tags"].(string)), &tags)
以下是Go Playground上的完整工作示例。