我是Golang的新手,我正在尝试在发生错误时将值解析为我的ErrorMessage结构。
我有这个结构:
type ErrorMessage struct {
Errors []struct {
Code string `json:"code"`
Message string `json:"message"`
Field string `json:"field,omitempty"`
} `json:"errors"`
Meta struct {
Status string `json:"status"`
} `json:"meta"`
}
映射为显示JSON,如下所示:
{
"errors": [
{
"code": "short-code",
"message": "Wow, such bad!"
},
{
"code": "other-code",
"message": "OMG, very error!",
"field": "This is the field"
}
],
"meta": {
"status": "error"
}
}
但是我无法弄清楚如何将控制器中的值解析为此Struct。对于一个基本的结构我理解并有这样的事情:
e := models.ErrorMessage{"Error", "404", "Field Missing"}
如何使用与上述类似的行,但是对于更复杂的Struct?
答案 0 :(得分:0)
如果将Error
和Meta
从内联结构中分离为预定义的结构类型,那么它就变得非常简单了:
type Error struct {
Code string `json:"code"`
Message string `json:"message"`
Field string `json:"field,omitempty"`
}
type Meta struct {
Status string `json:"status"`
}
type ErrorMessage struct {
Errors []Error `json:"errors"`
Meta Meta `json:"meta"`
}
msg := ErrorMessage {
Errors: []Error{
{Code: "f00", Message: "bar", Field: "wat"},
},
Meta: Meta{"WAT"},
}
答案 1 :(得分:0)
这里的问题是您使用匿名结构作为ErrorMessage
字段的类型。例如。 ErrorMessage.Errors
的元素类型是一个匿名结构。 ErrorMessage.Meta
的类型也是一个匿名结构。
不幸的是,使用匿名结构类型初始化变量需要您复制匿名结构声明,请参阅this answer for examples and more details。
我建议将您的匿名结构类型命名为:
type MyErr struct {
Code string `json:"code"`
Message string `json:"message"`
Field string `json:"field,omitempty"`
}
type MyMeta struct {
Status string `json:"status"`
}
type ErrorMessage struct {
Errors []MyErr `json:"errors"`
Meta MyMeta `json:"meta"`
}
然后你的任务就变得简单了:
res := ErrorMessage{
Errors: []MyErr{
MyErr{
Code: "short-code",
Message: "Wow, such bad!",
},
MyErr{
Code: "other-code",
Message: "OMG, very error!",
Field: "This is the field",
},
},
Meta: MyMeta{"error"},
}
data, err := json.MarshalIndent(&res, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(data))
这将产生您想要的输出。在Go Playground上尝试。