json和类型铸造

问题描述 投票:-3回答:1

我试图读取一个看起来像的json文件

 [{ "title": "hi", "tags": [1,2,3,4,5,6] }, {...}, {...}]

代码看起来像这样

 contentdat, err := ioutil.ReadFile("content.json")
 check(err)
 var content []interface{}
 err = json.Unmarshal(contentdat, &content)
 check(err)


for i, contentItem := range content {
    vertedContentItem := contentItem.(map[string]interface{})
    contentTags := vertedContentItem["tags"].([]interface{})
    contentItemTags := make([]int, len(contentTags))
    for i, ctv := range contentTags {
        contentItemTags[i] = int(ctv.(float64))
    }

我想弄清楚的是我如何避免做所有的类型转换,只是直接访问json obj或者只是为整个json结构输入一次。我有一个关于定义内部对象结构的想法

type Content struct {
  title string
  tags []int
}

然后将内容声明为

var content []Content

而不是接口{},只是按预期循环结构,但这不起作用。有任何想法吗?

json go
1个回答
2
投票

您必须使用大写字母导出要取消/序列化的“Content”结构的字段:

type Content struct {
  Title string
  Tags  []int
}

例如:

type Content struct {
  Title string
  Tags  []int
}

func main() {
  jsonstr := `[{"title":"hi","tags":[1,2,3,4,5,6]}]`
  contents := []Content{}

  err := json.Unmarshal([]byte(jsonstr), &contents)
  if err != nil {
    panic(err)
  }

  fmt.Printf("%#v\n", contents)
  // => []main.Content{main.Content{Title:"hi", Tags:[]int{1, 2, 3, 4, 5, 6}}}

}
© www.soinside.com 2019 - 2024. All rights reserved.