我的情况如下:
我有一个用 Go 制作的服务器/工作者。在后台例程中,服务器接收 JSON 格式的消息,然后使用此数据更新 MongoDB 数据库。
问题之一是,某些 MongoDB 数据类型,例如 ObjectId 和 Date,在必须表示为 JSON 时通常会转换为字符串,因此在将该数据插入数据库之前,我将 JSON 解组到一个结构中,并且然后将该结构发送到 MongoDB 驱动程序。该结构实现了 和 等方法UnmarshalJSON,MarshalBSONValue因此保留了它们的数据类型。
太好了,一切都解决了。但是通过使用结构我遇到了另一个问题,假设我有以下结构:
type Integers struct {
Foo *int `json:"foo" bson:"foo"`
Bar *int `json:"bar" bson:"foo"`
Baz *int `json:"baz" bson:"foo"`
}
然后我收到以下 JSON:
{"foo": 0, "bar": null}
有了这个 JSON,我应该用 , 和 ignore 更新我foo = 0的bar = null数据库baz。但是,如果我在我的结构中解组这个 JSON,我将拥有相当于:
Integers{
Foo: 1,
Bar: nil,
Baz: nil,
}
但是有了这个,我无法判断我是否收到了barand baz,或者他们只是默认为nil,所以我无法正确更新数据库。
我如何相信它可以解决:
通过具有以下结构:
type Integers struct {
Foo SmartassInt `json:"foo,omitempty" bson:"foo,omitempty"`
Bar SmartassInt `json:"bar,omitempty" bson:"bar,omitempty"`
Baz SmartassInt `json:"baz,omitempty" bson:"baz,omitempty"`
}
我将能够区分 anull和未收到的值,如下例所示:
var foo int = 0
var fooPointer *int = &foo
var barPointer *int = nil
integers := Integers{
Foo: &fooPointer,
Bar: &barPointer,
Baz: nil,
}
使用这种结构,baz不会被插入到数据库中,因为它的值是nil,并且nil由于 flag 被忽略omitempty。bar然而不是nil,但它指向nil,这与为空不同,因此它像null在数据库中一样正确插入。
但是我怎样才能用收到的 JSON 来实现这个初始化呢?
标准 JSON 解组器会将bar和都初始化baz为nil.
实现我自己的编组器方法,例如
type NullableInt **int
func (i NullableInt) MarshalJSON() ([]byte, error) {
}
func (i NullableInt) UnmarshalJSON(data []byte) error {
}
也不可能,因为NullableInt是指针,我无法在指针上实现方法。
那么,我可以使用哪种方法来解决这个问题?
凤凰求蛊
相关分类