英文:
Using Interfaces with Golang Maps and Structs and JSON
问题
我有一些 JSON 代码,可以看起来像这样:
{
"message_id": "12345",
"status_type": "ERROR",
"status": {
"x-value": "foo1234",
"y-value": "bar4321"
}
}
或者可能看起来像这样。如你所见,"status" 元素根据 "status_type" 的不同,从一个标准的字符串对象变成了一个字符串数组对象。
{
"message_id": "12345",
"status_type": "VALID",
"status": {
"site-value": [
"site1",
"site2"
]
}
}
我认为我需要让我的 "Status" 结构体接受一个类似于 "map[string]interface{}" 的映射,但我不确定具体该如何做。
你也可以在这里的 playground 上查看代码。
http://play.golang.org/p/wKowJu_lng
package main
import (
"encoding/json"
"fmt"
)
type StatusType struct {
Id string `json:"message_id,omitempty"`
Status map[string]string `json:"status,omitempty"`
}
func main() {
var s StatusType
s.Id = "12345"
m := make(map[string]string)
s.Status = m
s.Status["x-value"] = "foo1234"
s.Status["y-value"] = "bar4321"
var data []byte
data, _ = json.MarshalIndent(s, "", " ")
fmt.Println(string(data))
}
英文:
I have some JSON code that can look like:
{
"message_id": "12345",
"status_type": "ERROR",
"status": {
"x-value": "foo1234",
"y-value": "bar4321"
}
}
or can look like this. As you can see the "status" element changes from a standard object of strings to an object of array of strings, based on the status_type.
{
"message_id": "12345",
"status_type": "VALID",
"status": {
"site-value": [
"site1",
"site2"
]
}
}
I am thinking that I need to have my struct for "Status" take a map like "map[string]interface{}", but I am not sure exactly how to do that.
You can see the code here on the playground as well.
http://play.golang.org/p/wKowJu_lng
package main
import (
"encoding/json"
"fmt"
)
type StatusType struct {
Id string `json:"message_id,omitempty"`
Status map[string]string `json:"status,omitempty"`
}
func main() {
var s StatusType
s.Id = "12345"
m := make(map[string]string)
s.Status = m
s.Status["x-value"] = "foo1234"
s.Status["y-value"] = "bar4321"
var data []byte
data, _ = json.MarshalIndent(s, "", " ")
fmt.Println(string(data))
}
答案1
得分: 8
我已经弄清楚了,我想..
package main
import (
"encoding/json"
"fmt"
)
type StatusType struct {
Id string `json:"message_id,omitempty"`
Status map[string]interface{} `json:"status,omitempty"`
}
func main() {
var s StatusType
s.Id = "12345"
m := make(map[string]interface{})
s.Status = m
// 现在这个可以工作
// s.Status["x-value"] = "foo1234"
// s.Status["y-value"] = "bar4321"
// 这个也可以工作
sites := []string{"a", "b", "c", "d"}
s.Status["site-value"] = sites
var data []byte
data, _ = json.MarshalIndent(s, "", " ")
fmt.Println(string(data))
}
英文:
I figured it out, I think..
package main
import (
"encoding/json"
"fmt"
)
type StatusType struct {
Id string `json:"message_id,omitempty"`
Status map[string]interface{} `json:"status,omitempty"`
}
func main() {
var s StatusType
s.Id = "12345"
m := make(map[string]interface{})
s.Status = m
// Now this works
// s.Status["x-value"] = "foo1234"
// s.Status["y-value"] = "bar4321"
// And this works
sites := []string{"a", "b", "c", "d"}
s.Status["site-value"] = sites
var data []byte
data, _ = json.MarshalIndent(s, "", " ")
fmt.Println(string(data))
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论