从Golang中的JSON字符串解码一片地图

时间:2016-02-23 02:31:57

标签: json go

Go by Example: JSON tutorial之后,我看到了如何使用基本的JSON字符串:

package main

import (
    "encoding/json"
    "fmt"
    )

type Response struct {
    Page   int      `json:"page"`
    Fruits []string `json:"fruits"`
}

func main() {
    str := `{"page": 1, "fruits": ["apple", "peach"]}`
    res := Response{}
    json.Unmarshal([]byte(str), &res)
    fmt.Println(res.Page)
    fmt.Println(res.Fruits)
}

// the output looks good here:
// 1
// [apple peach]

我想为我正在解码的str数据对象添加一些复杂性。

即,我想添加一个带有一片地图的键作为其值:

"activities": [{"name": "running"}, {"name", "swimming"}]

我的脚本现在看起来像下面的例子,但是,对于我的生活,我无法弄清楚Response结构中的正确语法是什么,以便获得activities中的值。我知道这种语法不正确:Activities []string ...但不能破解我的方法来捕获我想要显示的数据。

package main

import (
    "encoding/json"
    "fmt"
    )

type Response struct {
    Page   int      `json:"page"`
    Fruits []string `json:"fruits"`
    Activities []string `json:"activities"`
}

func main() {
    str := `{"page": 1, "fruits": ["apple", "peach"], "activities": [{"name": "running"}, {"name", "swimming"}]}`
    res := Response{}
    json.Unmarshal([]byte(str), &res)
    fmt.Println(res.Page)
    fmt.Println(res.Fruits)
    fmt.Println(res.Activities)
}

// the script basically craps out here and returns:
// 0
// []
// []

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

使用[] map [string] string:

type Response struct {
    Page   int      `json:"page"`
    Fruits []string `json:"fruits"`
    Activities []map[string]string `json:"activities"`
}

playground example

始终检查并处理错误。 示例JSON具有语法错误,该错误在playground示例中得到纠正。

答案 1 :(得分:0)

我知道这是一个旧的,但我最近编写的实用程序用于从json输入生成精确的go类型,在类似的情况下你可以给它一个旋转:https://github.com/m-zajac/json2go

对于这个特殊的例子,它是从json生成的:

{"page": 1, "fruits": ["apple", "peach"], "activities": [{"name": "running"}, {"name": "swimming"}]}

去打字:

type Object struct {
    Activities  []struct {
        Name string `json:"name"`
    }   `json:"activities"`
    Fruits  []string    `json:"fruits"`
    Page    int     `json:"page"`
}