Golang JSON Tag 匹配問題

現(xiàn)象

type X struct {
    Data string `json:"data"`
}

func main() {
    var b = []byte(`{"DATA":"xxx"}`)
    x := &X{}
    _ = json.Unmarshal(b, x)
    fmt.Println(x) // 輸出: &{xxx}
}

疑問

json tag 不相等诡曙,即 data != DATA 為啥還可以反序列化成功呢由桌?

源碼

go/src/encoding/json/fold.go:foldFunc

// foldFunc returns one of four different case folding equivalence
// functions, from most general (and slow) to fastest:
//
// 1) bytes.EqualFold, if the key s contains any non-ASCII UTF-8
// 2) equalFoldRight, if s contains special folding ASCII ('k', 'K', 's', 'S')
// 3) asciiEqualFold, no special, but includes non-letters (including _)
// 4) simpleLetterEqualFold, no specials, no non-letters.
//
// The letters S and K are special because they map to 3 runes, not just 2:
//  * S maps to s and to U+017F '?' Latin small letter long s
//  * k maps to K and to U+212A '?' Kelvin sign
// See https://play.golang.org/p/tTxjOc0OGo
//
// The returned function is specialized for matching against s and
// should only be given s. It's not curried for performance reasons.
func foldFunc(s []byte) func(s, t []byte) bool {
    nonLetter := false
    special := false // special letter
    for _, b := range s {
        if b >= utf8.RuneSelf {
            return bytes.EqualFold
        }
        upper := b & caseMask
        if upper < 'A' || upper > 'Z' {
            nonLetter = true
        } else if upper == 'K' || upper == 'S' {
            // See above for why these letters are special.
            special = true
        }
    }
    if special {
        return equalFoldRight
    }
    if nonLetter {
        return asciiEqualFold
    }
    return simpleLetterEqualFold
}

看注釋還是挺容易理解的膊毁,主要分 4 種匹配場景牵舵。

然后在 decode.go 文件的 func (d *decodeState) object(v reflect.Value) error 函數(shù)绰姻。

如果 tag 相等邏輯繼續(xù)凰慈,否則通過 foldFunc 判斷菱属。

var f *field
if i, ok := fields.nameIndex[string(key)]; ok {
    // Found an exact name match.
    f = &fields.list[i]
} else {
    // Fall back to the expensive case-insensitive
    // linear search.
    for i := range fields.list {
        ff := &fields.list[i]
        if ff.equalFold(ff.nameBytes, key) {
            f = ff
            break
        }
    }
}

結(jié)果

嗯钳榨,所以出現(xiàn)了上述的問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纽门,一起剝皮案震驚了整個濱河市薛耻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赏陵,老刑警劉巖饼齿,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝙搔,居然都是意外死亡候醒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門杂瘸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倒淫,“玉大人,你說我怎么就攤上這事败玉〉型粒” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵运翼,是天一觀的道長返干。 經(jīng)常有香客問我,道長血淌,這世上最難降的妖魔是什么矩欠? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任财剖,我火速辦了婚禮,結(jié)果婚禮上癌淮,老公的妹妹穿的比我還像新娘躺坟。我一直安慰自己,他們只是感情好乳蓄,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布咪橙。 她就那樣靜靜地躺著,像睡著了一般虚倒。 火紅的嫁衣襯著肌膚如雪美侦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天魂奥,我揣著相機(jī)與錄音菠剩,去河邊找鬼。 笑死耻煤,一個胖子當(dāng)著我的面吹牛赠叼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播违霞,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼嘴办,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了买鸽?” 一聲冷哼從身側(cè)響起涧郊,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眼五,沒想到半個月后妆艘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡看幼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年批旺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诵姜。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡汽煮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棚唆,到底是詐尸還是另有隱情暇赤,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布宵凌,位于F島的核電站鞋囊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞎惫。R本人自食惡果不足惜溜腐,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一译株、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挺益,春花似錦歉糜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肃续。三九已至黍檩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間始锚,已是汗流浹背刽酱。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留瞧捌,地道東北人棵里。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像姐呐,于是被迫代替她去往敵國和親殿怜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容