【问题标题】:error while Unmarshalling json data using interface?使用接口解组json数据时出错?
【发布时间】:2018-07-09 11:11:27
【问题描述】:

我正在从数据库中检索数据并使用 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)
}

【问题讨论】:

    标签: json go interface


    【解决方案1】:

    来自 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

    【讨论】:

    • 你能告诉我如何将映射数据与结构绑定吗?
    • @puneet55667788 检查我编辑的关于使用结构的答案
    • 你做得很好!!谢谢
    • 投反对票的人请发表评论,以帮助我理解我的错误,以便我以后可以纠正它们,否则请不要无缘无故投反对票
    【解决方案2】:

    因为您正试图将数组解组为地图。

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

    var dat []map[string]interface{}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多