我使用第 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 = f
package main
import (
"encoding/json"
"fmt"
"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
}
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)
}
斯蒂芬大帝
相关分类