【问题标题】:Golang to Json, creating Google ChartsGolang to Json,创建谷歌图表
【发布时间】:2016-10-22 08:10:44
【问题描述】:

我正在使用 Polymer Google 图表。我想为单个 Controller.ServeJSON 调用创建 JSON,但如果设计更好,可以创建两个。

这是一个示例,说明如果是两次调用,JSON 将包含什么。

cols='[{"label":"Mth", "type":"string"}, {"label":"Days", "type":"number"}]' rows='[["一月", 31],["二月", 28],["三月", 31]]'

如果是一个

data='[["Month", "Days"], ["Jan", 31], ["Feb", 28], ["Mar", 31]]'

这可以在https://elements.polymer-project.org/elements/google-chart找到

我使用https://mholt.github.io/json-to-go/ 将 JSON 转换为结构体。

假设有两个电话,得到这个..

    type Chart struct {
        Cols []struct {
            Label string `json:"label"`
            Type  string `json:"type"`
        } `json:"cols"`
        Rows []struct {
            Num0 string `json:"0"`
            Num1 int    `json:"1"`

我们将不胜感激所有帮助和建议。

干杯。

编辑..

    func (c *ChillController) Get() {

jsonString := "[[\"Month\", \"Days\"], [\"Jan\", 31], [\"Feb\", 28], [\"Mar\", 31]]"
d := [][]Chart{}

json.Unmarshal([]byte(jsonString), &d)

fmt.Printf("%v", &d)

c.Data["json"] = &d
c.ServeJSON()

}

它返回了..

[ [ 空值, 空值 ], [ 空值, 空值 ] ]

我错过了什么。

【问题讨论】:

    标签: json go struct


    【解决方案1】:

    我一直使用 json-to-go 是我最喜欢的工具之一,但我发现了一个错误 https://github.com/mholt/json-to-go/issues/18

    你的结构应该看起来像:type Chart [][]interface{},换句话说就是一个切片。也看到这个问题Unmarshall nested JSON Arrays in Go / Golang

    编辑:

    更具体地说,您的 rows 是字符串和数字切片的切片,所以遗憾的是,我们不得不使用类似于我写给您的内容:[][]interface{},因为切片必须具有相同的类型并且在这种情况下,我们有字符串和数字,所以解决方案是空接口{}。也总是尝试使用刻度 `` 来表示 Go 中的原始 Json,它看起来更好,你不必转义引号。

    jsonString := `[
        ["Month", "Days"], ["Jan", 31], ["Feb", 28], ["Mar", 31]
    ]`
    
    var rows [][]interface{}
    
    err := json.Unmarshal([]byte(jsonString), &rows)
    
    if err != nil {
        fmt.Println("error:", err)
        return
    }
    
    fmt.Printf("%+v \n\n", rows)
    
    for _, row := range rows { // each row in this example is just one
    
        if len(row) < 2 {
            fmt.Println("unexpected row len")
            continue // or return error
        }
    
        // we can access to [0] or [1]
    
        month := row[0].(string) // column 1
        day := row[1]            // column 2
    
        if dayNumber, isNumber := day.(float64); isNumber { // by default use the biggest type for numbers float64
            fmt.Println("Month:", month, "Day number:", dayNumber)
            continue
        }
    
        if dayStr, isString := day.(string); isString {
            fmt.Println("Month:", month, "Day string:", dayStr)
            continue
        }
    }
    

    完整示例:https://play.golang.org/p/ZGtBRqP3Uj

    【讨论】:

    • 谢谢。我不完全掌握它似乎的概念。我试图实现这一改变。请参阅上面的编辑。我错过了什么。
    • 您正在尝试将切片解组为 Chart 结构,这是一个小技巧:如果您在 json 中看到“{}”,则使用映射结构,而“[]”则用于切片。我也编辑了我的答案:)
    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2016-11-27
    • 2012-09-12
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多