如何解散json

时间:2016-07-21 09:42:17

标签: json go

我正在使用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'在顶级值之后

3 个答案:

答案 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上的完整工作示例。