dongxingdu9594 2018-07-09 11:11
浏览 51
已采纳

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

I'm retrieving the data from database and using Jquery stringify the same data. Now I want to unmarshall that data. Data is as below:

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"}]

Code I'm using:

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条回答 默认 最新

  • douping1825 2018-07-09 11:17
    关注

    From Golang spec for Json unmarshal to interface{}:

    To unmarshal JSON into an interface value, Unmarshal stores one of these in the interface value:

    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
    

    Because the json that you are trying to unmarshal is an array so either use slice of interface{} as mentioned in Golang spec or slice of map[string]interface{} not map[string]interface{}. That's why returning an error. Change your variable declaration as

    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)
    }
    

    Working code on Go playground

    Edited: you can also go for using structs if you know your json structure.

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)