登录
首页 >  Golang >  Go问答

解析 JSON 并检测缺少的键和空值

来源:stackoverflow

时间:2024-02-17 21:12:25 216浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《解析 JSON 并检测缺少的键和空值》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

我正在使用一个应用程序 api,该 api 以不同的方式处理 json 中缺失的键和 null 值。它可能会返回像 {"value":null}{} 这样的 json - 如果密钥存在,它们意味着不同的东西。我的问题是我需要将数据解组到 struct 中,然后编组回 json,保留这种细微差别。

如果我定义一个结构,例如:

type test struct {
    value *string `json:"value,omitempty"`
}

然后 {"value":null} 被编组为 json 作为 {}

如果我定义一个结构,例如:

type Test struct {
    Value *string `json:"value"`
}

然后 {} 被编组为 json 为 {"value":null}

有没有办法处理从 json 读取的 null 和缺失键,并保留缺失键与 null 值之间的差异?


解决方案


如果必须区分字段的空值和不存在,可以使用 json.rawmessage

type test struct {
    value json.rawmessage `json:"value,omitempty"`
}

您可以测试 string(test.value)=="null"len(test.value)==0 来确定发生了哪种情况。

您可以实现 json.Marshalerjson.Unmarshaler 接口在自定义字符串类型上并使用“空字节”来表示 null。但是,您需要确保系统中依赖自定义字符串类型的其他部分能够识别空字节,并且它们能够正确处理此类实例。

type String string

const Null String = "\x00"

func (s *String) UnmarshalJSON(data []byte) error {
    if string(data) == "null" {
        *s = Null
    }
    return json.Unmarshal(data, (*string)(s))
}

func (s String) MarshalJSON() ([]byte, error) {
    if s == Null {
        return []byte(`null`), nil
    }
    return json.Marshal(string(s))
}

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

今天关于《解析 JSON 并检测缺少的键和空值》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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