亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JSON 整數在應該是值時返回 0

JSON 整數在應該是值時返回 0

Go
斯蒂芬大帝 2023-07-31 16:58:36
我有以下 JSON 文件并嘗試解析它。{"coord":{"lon":-121.31,"lat":38.7},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":73.26,"pressure":1018,"humidity":17,"temp_min":68,"temp_max":77},預期輸出為:當前溫度:73今日最低點:68今日最高點:77當前濕度:17%但它反而返回:當前溫度:0今天的最低價:0今天的最高價:0當前濕度:0%這是我試圖用來獲得所需回報的代碼:package mainimport (    "encoding/json"    "fmt"    "io/ioutil"    "os"    "strconv")type Daily struct {    Currenttemp int `json:"temp"`    Mintemp     int `json:"temp_min"`    Maxtemp     int `json:"temp_max"`    Humidity    int `json:"humidity"`}func main() {    jsonFile, err := os.Open("jsontest1.json")    if err != nil {        fmt.Println(err)    }    fmt.Println("Successfully Opened jsontest1.json")    defer jsonFile.Close()    byteValue, _ := ioutil.ReadAll(jsonFile)    var daily Daily    json.Unmarshal(byteValue, &daily)    fmt.Println("Current Temperature:"+strconv.Itoa(daily.Currenttemp))    fmt.Println("Today's Low:"+strconv.Itoa(daily.Mintemp))    fmt.Println("Today's High:"+strconv.Itoa(daily.Maxtemp))    fmt.Println("Current Humidity:"+strconv.Itoa(daily.Humidity)+"%")}我缺少什么?
查看完整描述

1 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

首先,您的示例 JSON 輸入格式錯誤:它},以}}. 這會導致json.Unmarshal返回錯誤:


unexpected EOF

解決這個問題會導致更多問題,其中許多問題人們已經在評論中指出。例如,您的輸入與您的 不具有相同的結構struct,并且 JSON 數字解碼為float64,而不是int。其中一個值(帶有鍵的值"temp")是73.26,它不是整數。


我有點不喜歡悄悄地忽略未知字段,所以我喜歡使用json.Decoder不允許未知字段的 a 。這有助于確保您不會因使用錯誤的標簽或錯誤級別的標簽而搞亂數據結構,因為當您這樣做時,您只會將所有缺失的字段設置為零。所以我喜歡添加一個“忽略”解碼器來顯式忽略字段:


type ignored [0]byte

func (i *ignored) UnmarshalJSON([]byte) error {

    return nil

}

然后,您可以聲明類型字段ignored,但仍然給它們 json 標簽(盡管默認匹配字段名稱往往就足夠了):


type overall struct {

    Coord   ignored

    Weather ignored

    Base    ignored

    Main    Daily

}

如果您確實想直接解組為整數類型,則需要再次花哨,就像我在示例中所做的那樣。直接解組可能更明智float64。如果您這樣做(使用float64而不添加特殊類型只是為了忽略某些字段),您可以放棄使用json.NewDecoder.


您可以變得更奇特,并使用指針來判斷您的字段是否已填寫,但我在示例中沒有這樣做。我剪掉了文件讀?。ㄒ约皩ψx取調用缺乏錯誤檢查)并使用硬編碼輸入數據。解碼確實有效的最終版本位于Go Playground 上。


查看完整回答
反對 回復 2023-07-31
  • 1 回答
  • 0 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號