Golang 转换 JSON

huangapple go评论90阅读模式
英文:

Golang Converting JSON

问题

map[key:2073933158088]

我需要将这个数据结构中的键作为字符串提取出来,但是我似乎无法弄清楚如何做到!

非常感谢对这个非常简单的问题的帮助。

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

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

为了定义data,我向IronMQ的队列发送了一个JSON数据包。然后我从队列中取出消息并进行了如下操作:

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)
英文:

map[key:2073933158088]

I need to grab the key out of this data structure as a string, but I can't seem to figure out how!

Help with this overly simple question very much appreciated.

The value above is encapsulated in the variable named data.

I have tried: data.key, data[key], data["key"], data[0] and none of these seem to be appropriate calls.

To define data I sent up a JSON packet to a queue on IronMQ. I then pulled the message from the queue and manipulated it like this:

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)

答案1

得分: 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)
}

这段代码定义了一个名为 Data 的结构体,其中包含一个 Key 字段,该字段使用 json:"key" 标签指定了 JSON 中对应的键名。在 main 函数中,我们创建了一个 Data 类型的指针 data,然后将 JSON 字符串解析为字节数组 raw,并使用 json.Unmarshal 函数将其解析为 data 对象。最后,我们打印出 data.Key 的值。

英文:

Design your data type to match json structure. This is how can you achieve this:

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)
}

答案2

得分: 2

由于json中的数字未加引号,它不是一个字符串,如果你尝试将其作为字符串处理,Go语言会发生错误。这里有一个可行的替代方案:

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)
}

你可以在playground上查看结果:http://play.golang.org/p/5hU3hdV3kK

英文:

Since the number in the json is unquoted, it's not a string, Go will panic if you try to just handle it as a string (playground: http://play.golang.org/p/i-NUwchJc1).

Here's a working alternative:

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)
}

You can see the result in the playground: http://play.golang.org/p/5hU3hdV3kK

huangapple
  • 本文由 发表于 2014年4月8日 02:06:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/22919856.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定