如何在golang中解析json数组结构

时间:2018-11-29 11:34:36

标签: go

im使用以下代码未能成功解析json值,但解析其内部数组[]

https://play.golang.org/p/5HdWeyEtvie

package main

import (
    "encoding/json"
    "fmt"
)


var input = `
[
{
    "created_at": "Thu May 31 00:00:01 +0000 2012"
},
{
    "created_at": "Thu May 31 00:00:01 +0000 2012"
}
]
`

func main() {
    var val map[string]interface{}
    if err := json.Unmarshal([]byte(input), &val); err != nil {
        panic(err)
    }
    fmt.Println(val)
}

这个想法是将值作为键并打印出来,就像获取字符串参数=“ created_at”并打印出来的函数一样。

4 个答案:

答案 0 :(得分:1)

var val []struct{
    CreatedAt string `json:"created_at"`
}{}

if err := json.Unmarshal([]byte(input), &val); err != nil {
    panic(err)
}

答案 1 :(得分:1)

您正在将数组解组到地图。那显然是行不通的。您需要val作为数组。

func main() {
    var val []map[string]interface{} // <---- This must be an array to match input
    if err := json.Unmarshal([]byte(input), &val); err != nil {
        panic(err)
    }
    fmt.Println(val)
}

答案 2 :(得分:0)

您应该创建这样的结构。

type Data struct {
    CreateAt time.Time `json:"create_at"`
}

func main() {
    var in []Data
    if err := json.Unmarshal([]byte(input), &in); err != nil{
        log.Fatal(err)
    }
    for _, data := range in{
        fmt.Println(data.CreateAt)
    }
}

答案 3 :(得分:0)

您的输入是:

[  
   {  
      "created_at":"Thu May 31 00:00:01 +0000 2012"
   },
   {  
      "created_at":"Thu May 31 00:00:01 +0000 2012"
   }
]

您可以将其转换为如下结构:

type MyArray []struct {
    CreatedAt string `json:"created_at"`
}

现在,您可以读取JSON数据并循环遍历以获得所需的值。这是您得到的:

package main

import (
    "encoding/json"
    "fmt"
)

var str = `[
    {
    "created_at": "Thu May 31 00:00:01 +0000 2012"
    },
    {
    "created_at": "Thu May 31 00:00:01 +0000 2013"
    }
]`

type MyArray struct {
    CreatedAt string `json:"created_at"`
}

func main() {
    var m []MyArray
    if err := json.Unmarshal([]byte(str), &m); err != nil {
        panic(err)
    }
    for _, val := range m {
        fmt.Println(val.CreatedAt)
    }
}

将来,如果不确定如何将JSON对象转换为结构,可以咨询JSON-to-Go,这非常有用。干杯!