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 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加