溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用golang源碼分析simplejson

發(fā)布時間:2021-12-13 19:40:32 來源:億速云 閱讀:204 作者:柒染 欄目:大數據

如何用golang源碼分析simplejson,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

背景:
1,golang自帶的json解析庫encoding/json提供了json字符串到json對象的相互轉換,在json字符串比較簡單的情況下還是挺好用的,但是當json字符串比較復雜或者嵌套比較多的時候,就顯得力不從心了,不可能用encoding/json那種為每個嵌套字段定義一個struct類型的方式,這時候使用simplejson庫能夠很方便的解析。

2,當被解析的json數據不一定完整的時候,使用標準庫經常會解析失敗,但是解析部分數據也是我們能接受的,這時可以用simplejson

源碼

如何用golang源碼分析simplejson

可以看到,基本思路是將數據解析進一個interface{},然后進行類型推斷。

底層還是用的標準庫

func NewJson(body []byte) (*Json, error) {  j := new(Json)  err := j.UnmarshalJSON(body)  }    func (j *Json) UnmarshalJSON(p []byte) error {  dec := json.NewDecoder(bytes.NewBuffer(p))  dec.UseNumber()  return dec.Decode(&j.data)}    func (j *Json) Map() (map[string]interface{}, error) {  if m, ok := (j.data).(map[string]interface{}); ok {    return m, nil            func (j *Json) Array() ([]interface{}, error) {  if a, ok := (j.data).([]interface{}); ok {    return a, nil

 json.Decoder vs json.Unmarshal

son的反序列化方式有兩種:

Use json.Unmarshal passing the entire response string

// func Unmarshal(data []byte, v interface{}) error

data, err := ioutil.ReadAll(resp.Body)

if err == nil && data != nil {

    err = json.Unmarshal(data, value)

}

using json.NewDecoder.Decode

// func NewDecoder(r io.Reader) *Decoder

// func (dec *Decoder) Decode(v interface{}) error

err = json.NewDecoder(resp.Body).Decode(value)

這兩種方法看似差不多,但有不同的應用場景

Use json.Decoder if your data is coming from an io.Reader stream, or you need to decode multiple values from a stream of data.

For the case of reading from an HTTP request, I’d pick json.Decoder since you’re obviously reading from a stream.

Use json.Unmarshal if you already have the JSON data in memory.

從文件中讀入一個巨大的json數組用json.Decoder

json.Decoder會一個一個元素進行加載,不會把整個json數組讀到內存里面

從文件中讀入json流用json.Decode

本來就以[]byte存在于內存中的用json.Unmarshal

看完上述內容,你們掌握如何用golang源碼分析simplejson的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI