第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

解組 JSON 保留空值

解組 JSON 保留空值

Go
飲歌長(zhǎng)嘯 2022-05-05 17:57:07
我的情況如下:我有一個(gè)用 Go 制作的服務(wù)器/工作者。在后臺(tái)例程中,服務(wù)器接收 JSON 格式的消息,然后使用此數(shù)據(jù)更新 MongoDB 數(shù)據(jù)庫。問題之一是,某些 MongoDB 數(shù)據(jù)類型,例如 ObjectId 和 Date,在必須表示為 JSON 時(shí)通常會(huì)轉(zhuǎn)換為字符串,因此在將該數(shù)據(jù)插入數(shù)據(jù)庫之前,我將 JSON 解組到一個(gè)結(jié)構(gòu)中,并且然后將該結(jié)構(gòu)發(fā)送到 MongoDB 驅(qū)動(dòng)程序。該結(jié)構(gòu)實(shí)現(xiàn)了 和 等方法UnmarshalJSON,MarshalBSONValue因此保留了它們的數(shù)據(jù)類型。太好了,一切都解決了。但是通過使用結(jié)構(gòu)我遇到了另一個(gè)問題,假設(shè)我有以下結(jié)構(gòu):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}有了這個(gè) JSON,我應(yīng)該用 , 和 ignore 更新我foo = 0的bar = null數(shù)據(jù)庫baz。但是,如果我在我的結(jié)構(gòu)中解組這個(gè) JSON,我將擁有相當(dāng)于:Integers{    Foo: 1,    Bar: nil,    Baz: nil,}但是有了這個(gè),我無法判斷我是否收到了barand baz,或者他們只是默認(rèn)為nil,所以我無法正確更新數(shù)據(jù)庫。我如何相信它可以解決:通過具有以下結(jié)構(gòu):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"`}我將能夠區(qū)分 anull和未收到的值,如下例所示:var foo int = 0var fooPointer *int = &foovar barPointer *int = nilintegers := Integers{    Foo: &fooPointer,    Bar: &barPointer,    Baz: nil,}使用這種結(jié)構(gòu),baz不會(huì)被插入到數(shù)據(jù)庫中,因?yàn)樗闹凳莕il,并且nil由于 flag 被忽略omitempty。bar然而不是nil,但它指向nil,這與為空不同,因此它像null在數(shù)據(jù)庫中一樣正確插入。但是我怎樣才能用收到的 JSON 來實(shí)現(xiàn)這個(gè)初始化呢?標(biāo)準(zhǔn) JSON 解組器會(huì)將bar和都初始化baz為nil.實(shí)現(xiàn)我自己的編組器方法,例如type NullableInt **intfunc (i NullableInt) MarshalJSON() ([]byte, error) {}func (i NullableInt) UnmarshalJSON(data []byte) error {}也不可能,因?yàn)镹ullableInt是指針,我無法在指針上實(shí)現(xiàn)方法。那么,我可以使用哪種方法來解決這個(gè)問題?
查看完整描述

1 回答

?
鳳凰求蠱

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊

在解碼方面,您可以為自定義類型編寫自定義解組器:


type MaybeInt struct {

    Present bool

    Null    bool

    Value   int64

}


func (m *MaybeInt) UnmarshalJSON(data []byte) error {

    s := string(data)

    m.Present = true

    if s == "null" {

        m.Null = true

        return nil

    }

    v, err := strconv.ParseInt(s, 10, 64)

    m.Value = v

    return err

}

完整的例子在這里。不幸的是,這在編碼方面不起作用:MarshalJSON處理程序無法指示該字段為空。顯而易見的方法是nil, nil從 Marshaler 返回,但這不起作用。也不回[]byte{}, nil。


你可能會(huì)想:好吧,讓我們使用一個(gè)指針,并將它設(shè)置為nil當(dāng)我們想說該字段應(yīng)該被省略時(shí)。這適用于解碼端,但現(xiàn)在編碼端失敗了,因?yàn)榫幋a器看到文字null并且根本不調(diào)用我們的編碼器!


最終,我們可以將這兩種技術(shù)結(jié)合起來:讀入MaybeInt、編碼(寫入)*MaybeInt。我們需要并行結(jié)構(gòu)類型。我們可以根據(jù)輸入類型設(shè)置輸出類型。我不認(rèn)為這很漂亮,而且其中的reflect代碼很糟糕(你也可以看到我所有的調(diào)試痕跡),但這實(shí)際上似乎有效:Playground link。在實(shí)踐中reflect,您可能只為每個(gè)“可能”值的情況編寫一個(gè)函數(shù),而不是使用 。


查看完整回答
反對(duì) 回復(fù) 2022-05-05
  • 1 回答
  • 0 關(guān)注
  • 185 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)