1 回答

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
首先,您的示例 JSON 輸入格式錯(cuò)誤:它},以}}. 這會(huì)導(dǎo)致json.Unmarshal返回錯(cuò)誤:
unexpected EOF
解決這個(gè)問題會(huì)導(dǎo)致更多問題,其中許多問題人們已經(jīng)在評(píng)論中指出。例如,您的輸入與您的 不具有相同的結(jié)構(gòu)struct,并且 JSON 數(shù)字解碼為float64,而不是int。其中一個(gè)值(帶有鍵的值"temp")是73.26,它不是整數(shù)。
我有點(diǎn)不喜歡悄悄地忽略未知字段,所以我喜歡使用json.Decoder不允許未知字段的 a 。這有助于確保您不會(huì)因使用錯(cuò)誤的標(biāo)簽或錯(cuò)誤級(jí)別的標(biāo)簽而搞亂數(shù)據(jù)結(jié)構(gòu),因?yàn)楫?dāng)您這樣做時(shí),您只會(huì)將所有缺失的字段設(shè)置為零。所以我喜歡添加一個(gè)“忽略”解碼器來顯式忽略字段:
type ignored [0]byte
func (i *ignored) UnmarshalJSON([]byte) error {
return nil
}
然后,您可以聲明類型字段ignored,但仍然給它們 json 標(biāo)簽(盡管默認(rèn)匹配字段名稱往往就足夠了):
type overall struct {
Coord ignored
Weather ignored
Base ignored
Main Daily
}
如果您確實(shí)想直接解組為整數(shù)類型,則需要再次花哨,就像我在示例中所做的那樣。直接解組可能更明智float64。如果您這樣做(使用float64而不添加特殊類型只是為了忽略某些字段),您可以放棄使用json.NewDecoder.
您可以變得更奇特,并使用指針來判斷您的字段是否已填寫,但我在示例中沒有這樣做。我剪掉了文件讀取(以及對(duì)讀取調(diào)用缺乏錯(cuò)誤檢查)并使用硬編碼輸入數(shù)據(jù)。解碼確實(shí)有效的最終版本位于Go Playground 上。
- 1 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報(bào)