使用接口解组json数据时出错?

时间:2018-07-09 11:11:28

标签: json go interface

我正在从数据库中检索数据,并使用Jquery将相同的数据字符串化。现在,我想解组数据。数据如下:

values = [{"day":"Sunday","time_slug":1,"timing":"8:00 am - 9:00 am","count":"1"},
  {"day":"Sunday","time_slug":2,"timing":"10:00 am - 11:00 am","count":"1"}]

我正在使用的代码:

func SaveProviderSpot(c *gin.Context) {
 //values := c.PostForm("array")
 byt := []byte(values)
 var dat map[string]interface{}
 if err := json.Unmarshal(byt, &dat); err != nil {
     panic(err)
  }
  fmt.Println(dat)
}

2 个答案:

答案 0 :(得分:0)

因为您正在尝试将数组解组到地图中。

最简单的解决方法是将地图集解组为一个地图

var dat []map[string]interface{}

答案 1 :(得分:0)

根据Json unmarshal to interface{}的Golang规范:

  

要将JSON解组为接口值,Unmarshal存储以下内容之一:   这些在界面值中:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays // slice of interface{}
map[string]interface{}, for JSON objects
nil for JSON null

因为您要解组的json是一个数组,所以请使用Golang规范中提到的interface{}切片或map[string]interface{}而不是map[string]interface{}切片。这就是为什么返回错误。将变量声明更改为

package main

import (
    "fmt"
    "encoding/json"
)

func main() {
    bytes := []byte(`[{"day":"Sunday","time_slug":1,"timing":"8:00 am - 9:00 am","count":"1"},
  {"day":"Sunday","time_slug":2,"timing":"10:00 am - 11:00 am","count":"1"}]`)  
    var result []interface{}
    if err := json.Unmarshal(bytes, &result); err != nil{
        fmt.Println(err)
    }
    fmt.Println(result)
}

Go playground上工作的代码

已编辑:如果您知道json结构,也可以使用结构。

package main

import (
    "fmt"
    "encoding/json"
)

type ResultData []struct {
    Day      string `json:"day"`
    TimeSlug int    `json:"time_slug"`
    Timing   string `json:"timing"`
    Count    string `json:"count"`
}

func main() {
    bytes := []byte(`[{"day":"Sunday","time_slug":1,"timing":"8:00 am - 9:00 am","count":"1"},
  {"day":"Sunday","time_slug":2,"timing":"10:00 am - 11:00 am","count":"1"}]`)  
    var result ResultData
    if err := json.Unmarshal(bytes, &result); err != nil{
        fmt.Println(err)
    }
    fmt.Println(result)
}

Playground Example