登录
首页 >  Golang >  Go问答

用 sql.NullFloat64 包装 json.Number

来源:stackoverflow

时间:2024-04-07 23:09:35 166浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《用 sql.NullFloat64 包装 json.Number》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我正在使用一个 api,该 api 具有 json 值,这些值可以是数字或字符串,有时可以是空字符串。例如:

[
    {
        "description": "doorknob",
        "amount": 3.25
    },
    {
        "description": "light bulb",
        "amount": "4.70"
    },
    {
        "description": "screwdriver",
        "amount": ""
    }
]

我了解到可以使用 json.number 来处理值可以是数字或字符串的情况。但是我该如何处理它是空字符串的情况呢?

我需要将这些值插入到 postgres 数据库中,因此我希望在空字符串显示为 null 的情况下,我认为 sql.nullfloat64 最适合处理它。

这是我正在使用的一个函数,它适用于前两种情况(门把手和灯泡),但无法解组最后一种情况(“螺丝刀”)。

这是我尝试使用的解组函数,但我不明白为什么它不起作用:

type NullNumber struct{ sql.NullFloat64 }

func (nn *NullNumber) UnmarshalJSON(data []byte) error {
    var x *json.Number
    if err := json.Unmarshal(data, &x); err != nil {
        return err
    }
    if len(*x) == 0 {
        nn.Valid = false // This doesn't seem to be working. Why?
    }
    this, err := x.Float64()
    if err != nil {
        return err
    }
    nn.Valid = true
    nn.Float64 = this
    return nil
}

在这种情况下我应该使用开放接口来获取金额吗?

非常感谢任何帮助。

演示:https://play.golang.org/p/qyqrq94otv3


解决方案


你就快到了!当 json.number 被赋予空字符串时,json.unmarshal 调用错误。

预先添加此检查:

// edge case: json.Number is given an empty string
if bytes.Equal(data, []byte(`""`)) {
    nn.Valid = false
    return nil
}

https://play.golang.org/p/ILxC8tjYI_G

本篇关于《用 sql.NullFloat64 包装 json.Number》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>