Golang JSON for Struct - 错误消息

时间:2015-05-14 10:15:18

标签: json struct go

我是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?

2 个答案:

答案 0 :(得分:0)

如果将ErrorMeta从内联结构中分离为预定义的结构类型,那么它就变得非常简单了:

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上尝试。