【问题标题】:Golang JSON for Struct - Error MessageGolang JSON for Struct - 错误消息
【发布时间】:2016-08-23 20:24:57
【问题描述】:

我是 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"
    }
}

但是我不知道如何将控制器中的值解析到这个结构中。对于一个基本的结构,我理解并有这样的东西: e := models.ErrorMessage{"Error", "404", "Field Missing"}

如果是更复杂的 Struct,如何使用与上述类似的行?

【问题讨论】:

  • 你想在Go中创建一个ErrorMessage的值,或者你想把一个JSON文本解析成一个ErrorMessage类型的变量?
  • 我想在 Go 中创建一个 ErrorMessage 的值,然后基本上会被渲染。 return c.RenderJson(e)

标签: json struct go


【解决方案1】:

如果您将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"},
}

【讨论】:

    【解决方案2】:

    这里的问题是您使用匿名结构作为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 上试试吧。

    【讨论】:

      猜你喜欢
      • 2022-12-29
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多