亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

使用Go語言解析動態JSON格式的方法

2020-04-01 19:00:16
字體:
來源:轉載
供稿:網友

通常使用Golang encoding/json 標準庫可以方便的編碼/解析JSON數據,但是前提需要定義struct數據結構。特別是解析未知結構的JSON數據時,原有方法很難滿足需求了,本文主要介紹動態解析JSON格式。

Go語言的JSON 庫

Go語言自帶的JSON轉換庫為 encoding/json

1.1)其中把對象轉換為JSON的方法(函數)為 json.Marshal(),其函數原型如下

func Marshal(v  interface{}) ([]byte, error)

也就是說,這個函數接收任意類型的數據 v,并轉換為字節數組類型,返回值就是我們想要的JSON數據和一個錯誤代碼。當轉換成功的時候,這個錯誤代碼為nil

在進行對象轉換為 JSON 的過程中,會遵循如下幾條規則:

  1. 布爾型轉換為 JSON 后仍是布爾型 , 如true -> true
  2. 浮點型和整數型轉換后為JSON里面的常規數字,如 1.23 -> 1.23
  3. 字符串將以UTF-8編碼轉化輸出為Unicode字符集的字符串,特殊字符比如<將會被轉義為/u003c
  4. 數組和切片被轉換為JSON 里面的數組,[]byte類會被轉換為base64編碼后的字符串,slice的零值被轉換為null
  5. 結構體會轉化為JSON對象,并且只有結構體里邊以大寫字母開頭的可被導出的字段才會被轉化輸出,而這些可導出的字段會作為JSON對象的字符串索引
  6. 轉化一個map 類型的數據結構時,該數據的類型必須是 map[string]T(T 可以是encoding/json 包支持的任意數據類型)

1.2)把 JSON 轉換回對象的方法(函數)為 json.Unmarshal(),其函數原型如下

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

這個函數會把傳入的 data 作為一個JSON來進行解析,解析后的數據存儲在參數 v 中。這個參數 v 也是任意類型的參數(但一定是一個類型的指針),原因是我們在是以此函數進行JSON 解析的時候,這個函數不知道這個傳入參數的具體類型,所以它需要接收所有的類型。

那么,在進行解析的時候,如果JSON 和 對象的結構不對口會發生什么呢,這就需要解析函數json.Unmarshal()遵循以下規則

json.Unmarshal() 函數會根據一個約定的順序查找目標結構中的字段,如果找到一個即發生匹配。那什么是找到了呢?關于“找到了”又有如下的規則:假設一個JSON對象有個名為"Foo"的索引,要將"Foo"所對應的值填充到目標結構體的目標字段上,json.Unmarshal() 將會遵循如下順序進行查找匹配

  1. § 一個包含Foo 標簽的字段
  2. §  一個名為Foo 的字段
  3. § 一個名為Foo 或者Foo 或者除了首字母其他字母不區分大小寫的名為Foo 的字段。 這些字段在類型聲明中必須都是以大寫字母開頭、可被導出的字段。

注意:如果JSON中的字段在Go目標類型中不存在,json.Unmarshal() 函數在解碼過程中會丟棄該字段。

當JSON 的結構是未知的時候,會遵循如下規則:

  1. § JSON中的布爾值將會轉換為Go中的bool類型
  2. § 數值會被轉換為Go中的float64類型
  3. § 字符串轉換后還是string類型
  4. § JSON數組會轉換為[]interface{} 類型
  5. § JSON對象會轉換為map[string]interface{}類型
  6. § null值會轉換為nil

注意:在Go的標準庫encoding/json包中,允許使用map[string]interface{}和[]interface{} 類型的值來分別存放未知結構的JSON對象或數組

1、傳統方法

比如 User 數據結構如下:

type User struct { Name string `json:"name"` Age int  `json:"age"`}

在定義struct字段的時候,可以在字段后面添加tag,來控制encode/decode的過程:是否要 decode/encode 某個字段,JSON 中的字段名稱是什么。字段名首字母控制字段的可見性,若要輸出到JSON,首字母需要大寫。

三種tag:

- :不要解析這個字段

omitempty :當字段為空(默認值)時,不要解析這個字段。比如 false、0、nil、長度為 0 的 array,map,slice,string

FieldName :當解析 json 的時候,使用這個名字

舉例來說吧:

// 解析的時候忽略該字段。默認情況下會解析這個字段,因為它是大寫字母開頭的Field int `json:"-"`// 解析(encode/decode) 的時候,使用 `other_name`,而不是 `Field`Field int `json:"other_name"`// 解析的時候使用 `other_name`,如果struct 中這個值為空,就忽略它Field int `json:"other_name,omitempty"`

(1)encode

user := User{Name: "test", Age:23}data, err := json.Marshal(user)if err != nil { fmt.Println(string(data))}

data 就是 []byte 類型的數組,里面包含了解析為 JSON 之后的數據,可以使用string(data)轉型為string。

(2)decode

要把JSON數據轉換成Go類型的值(Decode),可以使用 json.Unmarshal 。

var user Usererr = json.Unmarshal(data, &user)if err != nil { fmt.Errorf("Can not decode data: %v/n", err)}

2、動態解析

動態JSON結構未知,若使用前面方法需要事先定義數據結構,這與PHP/Python JSON處理非常不同。若不考慮性能,使用simplejson。

(1)simplejson

js, err := simplejson.NewJson([]byte(`{ "test": {  "string_array": ["asdf", "zxcv"],  "array": [1, "2", 3],  "arraywithsubs": [{"subkeyone": 1},  "bignum": 9223372036854775807,  "string": "simplejson",  "bool": true } }`)) if err != nil {  panic("json format error") } //獲取某個字段值 s, err := js.Get("test").Get("string").String() if err != nil {  panic(err) } fmt.Println(s) //檢查某個字段是否存在 _, ok := js.Get("test").CheckGet("string2") if ok {  fmt.Println("存在!") } else {  fmt.Println("不存在") }

(2)interface

比如JSON有以下兩種類型:

{"Type":"sound","Msg":{"Description":"dynamite","Authority":"the Bruce Dickinson"}}{"Type":"cowbell","Msg":{"More":true}}

Msg 具體什么類型實現無法判斷, Msg being a map[string]interface{} :

type Envelope struct { Type string Msg interface{}}var env Envelopeif err := json.Unmarshal([]byte(input), &env); err != nil {  log.Fatal(err) }// for the love of Gopher DO NOT DO THISvar desc string = env.Msg.(map[string]interface{})["description"].(string)fmt.Println(desc)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚州av一区二区| 欧美激情手机在线视频| 日韩精品福利网站| 57pao成人国产永久免费| 欧美精品免费播放| 国内精品小视频| 国产日韩欧美日韩大片| 少妇激情综合网| 亚洲美女视频网| 日本人成精品视频在线| 欧美亚洲另类激情另类| 亚洲成色999久久网站| 俺去了亚洲欧美日韩| 亚洲美女av黄| 亚洲日本中文字幕| 精品久久久一区| 国产精品入口免费视频一| 午夜免费日韩视频| 久久精品国产久精国产思思| 欧美成人免费va影院高清| 91免费视频网站| 欧美成人性色生活仑片| 97**国产露脸精品国产| 国产精品一区二区三区毛片淫片| 日韩免费在线免费观看| 欧美成人免费va影院高清| 亚洲黄色免费三级| 国产视频精品在线| 亚洲欧美制服中文字幕| 欧美一级在线亚洲天堂| 亚洲精品www| 久久久精品欧美| 久久夜色精品亚洲噜噜国产mv| 亚洲色图17p| 欧美日韩视频免费播放| 欧美极品少妇xxxxⅹ免费视频| 91av在线免费观看视频| 亚洲一区999| 国产成人小视频在线观看| 中文字幕9999| 亚洲人成电影网站色xx| 欧美久久精品一级黑人c片| 亚洲久久久久久久久久| 欧美性xxxx极品高清hd直播| 日韩网站免费观看| 国产ts人妖一区二区三区| 免费91在线视频| 欧美黄色片视频| 国产精品96久久久久久| 欧美一级片在线播放| 激情成人中文字幕| 日本高清久久天堂| 欧美限制级电影在线观看| 亚洲精品aⅴ中文字幕乱码| 国产精品99久久久久久www| 精品中文视频在线| 亚洲欧洲免费视频| 美日韩丰满少妇在线观看| 欧美大秀在线观看| 亚洲xxxxx性| 欧美日韩午夜视频在线观看| 一本一道久久a久久精品逆3p| 亚洲激情视频在线| 亚洲美腿欧美激情另类| 色婷婷久久av| 色777狠狠综合秋免鲁丝| 国产精品久久久久久网站| 欧美美女18p| 岛国av一区二区| 国产一区二区久久精品| 一个人www欧美| 最近2019中文字幕大全第二页| 亚洲免费视频在线观看| 成人观看高清在线观看免费| 欧美色xxxx| 欧美日韩成人在线视频| 欧美www视频在线观看| 精品调教chinesegay| 国产综合久久久久| 中文字幕欧美亚洲| 亚洲欧美在线一区| 国产精品久久久久久中文字| 欧美国产在线视频| 国产亚洲综合久久| 精品国产区一区二区三区在线观看| 国产一区二区三区四区福利| 成人性生交大片免费看小说| 伊人久久大香线蕉av一区二区| 日韩av中文字幕在线免费观看| 精品福利樱桃av导航| 亚洲自拍偷拍第一页| 日韩电视剧免费观看网站| 亚洲成人精品久久久| 欧美日韩福利视频| 日韩av中文字幕在线| 2019中文字幕在线| 日韩精品在线看| 亚洲欧美一区二区精品久久久| 国外成人在线直播| 久久在线精品视频| 在线成人中文字幕| 亚洲视频自拍偷拍| 久久99亚洲热视| 国产精品久久久av久久久| 欧美日韩人人澡狠狠躁视频| 精品国产成人av| 国产精品人成电影在线观看| 国产噜噜噜噜久久久久久久久| 一区二区中文字幕| 国产精品成人一区二区| 啪一啪鲁一鲁2019在线视频| 国产成人精品视频在线观看| 黑人精品xxx一区一二区| 亚洲va欧美va国产综合久久| 久久人体大胆视频| 日韩欧美主播在线| 成人av色在线观看| 欧美性色19p| 国产精品高精视频免费| 精品久久久久久久久久久久久| 影音先锋日韩有码| 国产丝袜视频一区| 亚洲精品在线不卡| 久久精品久久精品亚洲人| 欧美日韩国产va另类| 91九色视频在线| 国产v综合v亚洲欧美久久| 亚洲最大的成人网| 欧美日韩性生活视频| 91成人性视频| 久99九色视频在线观看| 日韩免费高清在线观看| 日韩av手机在线看| 欧美精品免费在线观看| 91精品国产91久久久久久吃药| 欧美大胆在线视频| 国产精品女主播| 欧美老女人xx| 一区二区三区无码高清视频| 伊人久久五月天| 久久久久久久久久国产精品| 精品久久久久久中文字幕| 九色91av视频| 日韩一区二区久久久| 日韩av不卡在线| 欧美日韩免费观看中文| 欧美乱大交做爰xxxⅹ性3| 亚洲最大福利网站| 欧美日韩一区二区精品| 欧美综合在线观看| 精品精品国产国产自在线| 91免费福利视频| 日韩在线不卡视频| 萌白酱国产一区二区| 亚洲第一二三四五区| 北条麻妃在线一区二区| 精品偷拍各种wc美女嘘嘘| 视频在线观看一区二区| 日韩精品一区二区三区第95| 亚洲美女福利视频网站| 国产小视频91| 日韩美女免费观看| 日韩欧美国产成人| 色哟哟亚洲精品一区二区|