[英]How to Unmarshall data to JSON with unknown field types
我有這些“結構”
type Results struct {
Gender string `json:"gender"`
Name struct {
First string `json:"first"`
Last string `json:"last"`
} `json:"name"`
Location struct {
Postcode int `json:"postcode"`
}
Registered struct {
Date string `json:"date"`
} `json:"registered"`
}
type Info struct {
Seed string `json:"seed"`
Results int64 `json:"results"`
Page int64 `json:"page"`
Version string `json:"version"`
}
type Response struct {
Results []Results `json:"results"`
Info Info `json:"info"`
}
我向外部 API 發出請求並將數據轉換為 JSON 視圖。 我事先知道所有字段的類型,但是“郵政編碼”字段出現問題。 我得到不同類型的值,這就是為什么我得到 JSON 解碼錯誤。 在這種情況下,“郵政編碼”可以是以下三種變體之一:
將postcode
類型從string
更改為json.Number
解決了問題。 但是這個解決方案不滿足第三個“選項”。
我知道我可以嘗試創建自定義類型並在其上實現接口。 在我看來,使用json.RawMessage
的最佳解決方案。 這是我第一次遇到這個問題,所以我仍在尋找解決方案的實現並閱讀文檔。
在這種情況下,最好的解決方案是什么? 提前致謝。
聲明一個自定義字符串類型並讓它實現json.Unmarshaler
接口。
例如,您可以這樣做:
type PostCodeString string
// UnmarshalJSON implements the json.Unmarshaler interface.
func (s *PostCodeString) UnmarshalJSON(data []byte) error {
if data[0] != '"' { // not string, so probably int, make it a string by wrapping it in double quotes
data = []byte(`"`+string(data)+`"`)
}
// unmarshal as plain string
return json.Unmarshal(data, (*string)(s))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.