一個(gè)簡(jiǎn)單的golang json解析庫(kù)

golang原生的json解析庫(kù),有時(shí)候用起來(lái)一點(diǎn)都不方便豪嗽,自己簡(jiǎn)單封裝了一下,看下測(cè)試用例

var jsonStr2 = `{"int":1,"bool":false,"string":"123","object":{"key":111}}`

func TestJsonObject(t *testing.T) {
    object, err := NewJsonObject(jsonStr2)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(object.GetFloat64("int"))
    fmt.Println(object.GetBool("bool"))
    fmt.Println(object.GetString("string"))

    // 想要獲取內(nèi)層數(shù)據(jù),中間加點(diǎn)即可
    fmt.Println(object.GetFloat64("object.key"))
}

測(cè)試結(jié)果

1 <nil>
false <nil>
123 <nil>
111 <nil>

這里貼出代碼:

package jsonlib

import (
    "encoding/json"
    "errors"
    "strings"
)

var (
    ErrNil    = errors.New("error key not exist") // key所對(duì)應(yīng)的值不存在
    ErrFormat = errors.New("error formart")       // 類型轉(zhuǎn)換錯(cuò)誤
)

type JsonObject struct {
    data map[string]interface{}
}

// NewJsonObject 創(chuàng)建一個(gè)json對(duì)象
func NewJsonObject(str string) (*JsonObject, error) {
    jsonObject := new(JsonObject)
    err := json.Unmarshal([]byte(str), &jsonObject.data)
    if err != nil {
        return nil, err
    }
    return jsonObject, nil
}

func (o *JsonObject) getValue(key string) (interface{}, error) {
    m := o.data
    keys := strings.Split(key, ".")

    var (
        value interface{}
        ok    = false
    )

    for i := 0; i < len(keys)-1; i++ {
        value, ok = m[keys[i]]
        if !ok {
            return nil, ErrNil
        }
        m, ok = value.(map[string]interface{})
        if !ok {
            return nil, ErrFormat
        }
    }

    value, ok = m[keys[len(keys)-1]]
    if !ok {
        return nil, ErrNil
    }
    return value, nil
}

// GetBool 獲取Bool值
func (o *JsonObject) GetBool(key string) (bool, error) {
    value, err := o.getValue(key)
    if err != nil {
        return false, err
    }

    result, ok := value.(bool)
    if !ok {
        return false, ErrFormat
    }
    return result, nil
}

// GetFloat64 獲取float64值
func (o *JsonObject) GetFloat64(key string) (float64, error) {
    value, err := o.getValue(key)
    if err != nil {
        return 0, err
    }

    result, ok := value.(float64)
    if !ok {
        return 0, ErrFormat
    }
    return result, nil
}

// GetString 獲取string值
func (o *JsonObject) GetString(key string) (string, error) {
    value, err := o.getValue(key)
    if err != nil {
        return "", err
    }

    result, ok := value.(string)
    if !ok {
        return "", ErrFormat
    }
    return result, nil
}

// GetBool 獲取Bool值
func GetBool(str string, key string) (bool, error) {
    object, err := NewJsonObject(str)
    if err != nil {
        return false, err
    }
    return object.GetBool(key)
}

// GetFloat64 獲取float64值
func GetFloat64(str string, key string) (float64, error) {
    object, err := NewJsonObject(str)
    if err != nil {
        return 0, err
    }
    return object.GetFloat64(key)
}

// GetString 獲取string值
func GetString(str string, key string) (string, error) {
    object, err := NewJsonObject(str)
    if err != nil {
        return "", err
    }
    return object.GetString(key)
}

GitHub:https://github.com/alberliu/jsonlib

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末龟梦,一起剝皮案震驚了整個(gè)濱河市隐锭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌计贰,老刑警劉巖钦睡,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異躁倒,居然都是意外死亡荞怒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門秧秉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)褐桌,“玉大人,你說(shuō)我怎么就攤上這事象迎∮叮” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵挖帘,是天一觀的道長(zhǎng)完丽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拇舀,這世上最難降的妖魔是什么逻族? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮骄崩,結(jié)果婚禮上聘鳞,老公的妹妹穿的比我還像新娘。我一直安慰自己要拂,他們只是感情好抠璃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脱惰,像睡著了一般搏嗡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拉一,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天采盒,我揣著相機(jī)與錄音,去河邊找鬼蔚润。 笑死磅氨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嫡纠。 我是一名探鬼主播烦租,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼延赌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了叉橱?” 一聲冷哼從身側(cè)響起挫以,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赏迟,沒想到半個(gè)月后屡贺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蠢棱,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锌杀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泻仙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕再。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖玉转,靈堂內(nèi)的尸體忽然破棺而出突想,到底是詐尸還是另有隱情,我是刑警寧澤究抓,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布猾担,位于F島的核電站,受9級(jí)特大地震影響刺下,放射性物質(zhì)發(fā)生泄漏绑嘹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一橘茉、第九天 我趴在偏房一處隱蔽的房頂上張望工腋。 院中可真熱鬧,春花似錦畅卓、人聲如沸擅腰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)趁冈。三九已至,卻和暖如春拜马,著一層夾襖步出監(jiān)牢的瞬間渗勘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工一膨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呀邢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓豹绪,卻偏偏與公主長(zhǎng)得像价淌,于是被迫代替她去往敵國(guó)和親申眼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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