登录
首页 >  Golang >  Go问答

在 golang 中从 io.Reader 的 json 解码枚举

来源:stackoverflow

时间:2024-03-16 22:36:28 235浏览 收藏

在 Go 中从 io.Reader 的 JSON 解码枚举时,如果输入为 io.Reader,可以通过 NewDecoder 和 Decode 方法创建解码器,将结果传递给 UnmarshalJSON 方法进行解码。或者,还可以创建一个辅助方法 myUnmarshalJSON,在后台调用 UnmarshalJSON,从而实现从 io.Reader 解码枚举。

问题内容

我在 json 中有一个字段,它是 abcdef ,我想确保当我解组数据时,它检查该字段是否只包含两个有效值中的一个,有没有办法在 golang 中做到这一点没有临时检查?

我知道如果我有字节的 json 就可以做到

const(
   Enum1 = "abc"
   Enum1 = "def"
)

func (s *MyJsonStruct) UnmarshalJSON(data []byte) error {
    type Aux MyJsonStruct;
    var a *Aux = (*Aux)(s);
    err := json.Unmarshal(data, &a)
    if err != nil {
        return err
    }

    if s.Key != Enum1 && s.Key != Enum2 {
        s.Key = ""
        return errors.New("invalid value for Key")
    }
}

如果输入是 io.reader,如何覆盖 unmarshaljson


解决方案


根据doc,这里是unmarshaljson的签名。所以unmarshaljson的参数只能是[]byte类型

如果输入是 io.reader,则可以使用 NewDecoderDecode。这样,结果就可以传递给 unmarshaljson。

另一个选项是创建另一个方法,该方法将在后台调用 unmarshaljson

func (s *MyJsonStruct) myUnmarshalJSON(r io.Reader) error {
        type Aux MyJsonStruct;
        var a *Aux = (*Aux)(s);

        d := json.NewDecoder(r)
        d.Decode(&a)
        b := json.Marshal(a)
        s.UnmarshalJson(b)
}

func (s *MyJsonStruct) UnmarshalJSON([]byte) error {

    type Aux MyJsonStruct;
    var a *Aux = (*Aux)(s);

    d := json.NewDecoder(r)
    d.Decode(&a)


    if s.Key != Enum1 && s.Key != Enum2 {
        s.Key = ""
        return errors.New("invalid value for Key")
    }
}

终于介绍完啦!小伙伴们,这篇关于《在 golang 中从 io.Reader 的 json 解码枚举》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

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