2 回答

TA貢獻1851條經驗 獲得超5個贊
對解組方法使用指針接收器。如果使用值接收器,則在方法返回時對接收器的更改將丟失。
unmarshal 方法的參數是 JSON 文本。解組 JSON 文本以獲得刪除所有 JSON 引用的純字符串。
func (intValue *PersonID) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
*intValue = Lookup(s)
return nil
}
JSON 標記與示例 JSON 之間存在不匹配。我更改了 JSON 以匹配標簽,但您可以通過其他方式更改它。
if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil {
playground example

TA貢獻1799條經驗 獲得超9個贊
這是基于我的評論的答案。我不確定這正是您想要做的,因為您的一些問題措辭讓我感到困惑,但基本思想是將解組和轉換分成兩個不同的步驟。首先將原始數據解組為兼容類型,然后轉換為另一種類型或豐富您已經擁有的類型,如下例所示。歡迎您在自定義實現中隱藏此行為UnmarshalJSON如果你愿意,但我個人建議不要這樣做。這是我的兩個原因;1) 它只是與 Go 的顯式冗長編碼風格不一致 2) 我鄙視高度混淆的包/庫/語言,它們為你做這樣的事情,因為遲早它會咬你的屁股,比添加 1 花費更多在幾個地方有一行額外的代碼(比如幾個小時試圖調試對你來說毫無意義的東西)。
type MyType struct {
Id PersonID
Name string `json: "name"`
Count int `json: "count"`
Greeting string `json: "greeting"`
}
func main() {
var m MyType
if err := json.Unmarshal([]byte(`{"name": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil {
fmt.Println(err)
} else {
m.Id = Lookup(m.Name) // see this isn't unmarshalling
// better to take the data as is and do transformation separate
for i := 0; i < m.Count; i++ {
fmt.Println(m.Greeting, m.Person.Name())
}
}
}
- 2 回答
- 0 關注
- 198 瀏覽
添加回答
舉報