Golang转换JSON

时间:2014-04-07 18:06:13

标签: json go

map[key:2073933158088]

我需要从这个数据结构中获取密钥作为字符串,但我似乎无法弄清楚如何!

非常感谢这个过于简单的问题。

上面的值封装在名为data。的变量中。

我尝试过:data.keydata[key]data["key"]data[0],这些似乎都不合适。

要定义数据,我将一个JSON数据包发送到IronMQ上的队列。然后我从队列中拉出消息并按照这样操作:

payloadIndex := 0

for index, arg := range(os.Args) {
        if arg == "-payload" {
                payloadIndex = index + 1
        }
}

if payloadIndex >= len(os.Args) {
        panic("No payload value.")
}

payload := os.Args[payloadIndex]

var data interface{}

raw, err := ioutil.ReadFile(payload)

if err != nil {
    panic(err.Error())
}

err = json.Unmarshal(raw, &data)

2 个答案:

答案 0 :(得分:2)

设计数据类型以匹配json结构。这是如何实现这一目标的:

package main

import (
    "fmt"
    "encoding/json"
)

type Data struct {
    Key string `json:"key"`
}

func main() {
    data := new(Data)
    text := `{ "key": "2073933158088" }`
    raw := []byte(text)
    err := json.Unmarshal(raw, data)
    if err != nil {
        panic(err.Error())  
    }
    fmt.Println(data.Key)
}

答案 1 :(得分:2)

由于json中的数字是不加引号的,它不是一个字符串,如果你试图将它作为一个字符串处理,Go会发生恐慌(playground:http://play.golang.org/p/i-NUwchJc1)。

这是一个可行的替代方案:

package main

import (
    "fmt"
    "encoding/json"
    "strconv"
)

type Data struct {
    Key string `json:"key"`
}

func (d *Data) UnmarshalJSON(content []byte) error {
    var m map[string]interface{}
    err := json.Unmarshal(content, &m)
    if err != nil {
        return err
    }
    d.Key = strconv.FormatFloat(m["key"].(float64), 'f', -1, 64)
    return nil
}

func main() {
    data := new(Data)
    text := `{"key":2073933158088}`
    raw := []byte(text)
    err := json.Unmarshal(raw, data)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println(data.Key)
}

您可以在操场上看到结果:http://play.golang.org/p/5hU3hdV3kK