2015-05-14 101 views
1

我對Golang來說真的很陌生,我試圖在發生錯誤時將值解析到我的ErrorMessage結構中。Golang結構的JSON - 錯誤信息

我有這樣的結構:

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

如何使用類似於上面的行,但爲更復雜的結構?

+1

你想在Go中創建一個'ErrorMessage'的值,或者你想將一個JSON文本解析爲一個類型爲'ErrorMessage'的變量? – icza

+0

我想在Go中創建ErrorMessage的值,然後基本上會渲染它。 '返回c.RenderJson(e)' –

回答

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"}, 
} 
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