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

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

Go - 自定義解組器 - 浮動字符串

Go - 自定義解組器 - 浮動字符串

Go
侃侃爾雅 2023-02-06 18:53:19
我使用第 3 方 API,以字符串形式提供價格,有 3 種口味://Input[    {"id": "A", "price": "123"},    {"id": "B", "price": "123.5"},    {"id": "C", "price": ""}]//Expected output[    A 123,    B 123.5,    C 0]我知道我可以,string在我的結構中添加該部分,但這不會處理訂單 C。我發現了這個github 問題,其中詢問了有關 int 的問題。那里有一個游樂場代碼,我根據自己的需要做了一些改動。如果我將其更改為 float64 而不是 int,我會收到一個錯誤,訂單 A 的日志現在為 0。json: cannot unmarshal string into Go struct field Order.price of type float64[{A 0}]我認為這if string(data) ==  '""' {部分代碼將檢查空字符串(大小寫順序 C),如果是:設置為 0。但"123"不是""。除了下面的部分,我還了解其余的自定義解組器。有人能指出我正確的方向嗎?p := (*float64)(foe)*p = fpackage mainimport (    "encoding/json"    "fmt"    "strings")type StringToFloat float64type Order struct {    Id    string        `json:"id"`    Price StringToFloat `json:"price"`}func (foe *StringToFloat) UnmarshalJSON(data []byte) error {    if string(data) == `""` {        if foe != nil {            *foe = 0        }        return nil    }    var f float64    err := json.Unmarshal(data, &f)    if err != nil {        return err    }    p := (*float64)(foe)    *p = f    return nil}func main() {    jsonString := `[        {"id": "A", "price": "123"},        {"id": "B", "price": "123.5"},        {"id": "C", "price": ""}    ]`    var orders []Order    if err := json.NewDecoder(strings.NewReader(jsonString)).Decode(&orders); err != nil {        fmt.Println(err)    }    fmt.Println(orders)}
查看完整描述

1 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

嘗試這個


package main


import (

    "encoding/json"

    "fmt"

    "strconv"

    "strings"

)


type StringToFloat float64


type Order struct {

    Id    string        `json:"id"`

    Price StringToFloat `json:"price"`

}


func (foe *StringToFloat) UnmarshalJSON(data []byte) error {

    if string(data) == "\"\"" {

        if foe != nil {

            *foe = 0

        }

        return nil

    }

    num := strings.ReplaceAll(string(data), "\"", "")

    n, err := strconv.ParseFloat(num, 64)

    if err != nil {

        return err

    }

    *foe = StringToFloat(n)

    return nil

}


func main() {

    jsonString := `[

        {"id": "A", "price": "123"},

        {"id": "B", "price": "123.5"},

        {"id": "C", "price": ""}

    ]`

    var orders []Order

    if err := json.NewDecoder(strings.NewReader(jsonString)).Decode(&orders); err != nil {

        fmt.Println(err)

    }


    fmt.Println(orders)

}

去游樂場:https ://go.dev/play/p/cHjNQ447eX9

注意事項:

  • UmarshalJSON func 的函數簽名需要與 Decode 獲取的給定函數簽名完全相同。在您更新的代碼error中缺少返回類型

  • string(data)給出"123"所以需要在之前刪除引號ParseFloat

  • return nil在 string = ""check 之后是必需的,所以它不會走得更遠


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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