您好,登錄后才能下訂單哦!
本篇內容主要講解“Golang語言JSON解碼函數Unmarshal怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Golang語言JSON解碼函數Unmarshal怎么使用”吧!
func Unmarshal(data []byte, v interface{}) error
Unmarshal函數解析json編碼的數據并將結果存入v指向的值。
Unmarshal和Marshal做相反的操作,必要時申請映射、切片或指針,有如下的附加規則:
要將json數據解碼寫入一個指針,Unmarshal函數首先處理json數據是json字面值null的情況。此時,函數將指針設為nil;否則,函數將json數據解碼寫入指針指向的值;如果指針本身是nil,函數會先申請一個值并使指針指向它。
要將json數據解碼寫入一個結構體,函數會匹配輸入對象的鍵和Marshal使用的鍵(結構體字段名或者它的標簽指定的鍵名),優先選擇精確的匹配,但也接受大小寫不敏感的匹配。
要將json數據解碼寫入一個接口類型值,函數會將數據解碼為如下類型寫入接口:
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
如果一個JSON值不匹配給出的目標類型,或者如果一個json數字寫入目標類型時溢出,Unmarshal函數會跳過該字段并盡量完成其余的解碼操作。如果沒有出現更加嚴重的錯誤,本函數會返回一個描述第一個此類錯誤的詳細信息的UnmarshalTypeError。
JSON的null值解碼為go的接口、指針、切片時會將它們設為nil,因為null在json里一般表示“不存在”。 解碼json的null值到其他go類型時,不會造成任何改變,也不會產生錯誤。
當解碼字符串時,不合法的utf-8或utf-16代理(字符)對不視為錯誤,而是將非法字符替換為unicode字符U+FFFD。
示例代碼:
package main import ( "encoding/json" "fmt" ) // Actress 女演員 type Actress struct { Name string Birthday string BirthPlace string Opus []string } func main() { // 普通JSON // 因為json.UnMarshal() 函數接收的參數是字節切片, // 所以需要把JSON字符串轉換成字節切片。 jsonData := []byte(`{ "name":"迪麗熱巴", "birthday":"1992-06-03", "birthPlace":"新疆烏魯木齊市", "opus":[ "《阿娜爾罕》", "《逆光之戀》", "《克拉戀人》" ] }`) var actress Actress err := json.Unmarshal(jsonData, &actress) if err != nil { fmt.Println("error:", err) return } fmt.Printf("姓名:%s\n", actress.Name) fmt.Printf("生日:%s\n", actress.Birthday) fmt.Printf("出生地:%s\n", actress.BirthPlace) fmt.Println("作品:") for _, val := range actress.Opus { fmt.Println("\t", val) } }
運行結果:
姓名:迪麗熱巴
生日:1992-06-03
出生地:新疆烏魯木齊市
作品:
《阿娜爾罕》
《逆光之戀》
《克拉戀人》
示例代碼:
package main import ( "encoding/json" "fmt" ) // Opus 作品 type Opus struct { Date string Title string } // Actress 女演員 type Actress struct { Name string Birthday string BirthPlace string Opus Opus } func main () { // JSON嵌套普通JSON jsonData := []byte(`{ "name":"迪麗熱巴", "birthday":"1992-06-03", "birthPlace":"新疆烏魯木齊市", "opus": { "Date":"2013", "Title":"《阿娜爾罕》" } }`) var actress Actress err := json.Unmarshal(jsonData, &actress) if err != nil { fmt.Println("error:", err) return } fmt.Printf("姓名:%s\n", actress.Name) fmt.Printf("生日:%s\n", actress.Birthday) fmt.Printf("出生地:%s\n", actress.BirthPlace) fmt.Println("作品:") fmt.Printf("\t%s:%s", actress.Opus.Date, actress.Opus.Title)}
運行結果:
姓名:迪麗熱巴
生日:1992-06-03
出生地:新疆烏魯木齊市
作品:
2013:《阿娜爾罕》
示例代碼:
package main import ( "encoding/json" "fmt" ) type Opus struct { Date string Title string } type Actress struct { Name string Birthday string BirthPlace string Opus []Opus } func main () { // JSON嵌套數組JSON jsonData := []byte(`{ "name":"迪麗熱巴", "birthday":"1992-06-03", "birthPlace":"新疆烏魯木齊市", "opus":[ { "date":"2013", "title":"《阿娜爾罕》" }, { "date":"2014", "title":"《逆光之戀》" }, { "date":"2015", "title":"《克拉戀人》" } ] }`) var actress Actress err := json.Unmarshal(jsonData, &actress) if err != nil { fmt.Println("error:", err) return } fmt.Printf("姓名:%s\n", actress.Name) fmt.Printf("生日:%s\n", actress.Birthday) fmt.Printf("出生地:%s\n", actress.BirthPlace) fmt.Println("作品:") for _, val := range actress.Opus { fmt.Printf("\t%s - %s\n", val.Date, val.Title) } }
運行結果:
姓名:迪麗熱巴
生日:1992-06-03
出生地:新疆烏魯木齊市
作品:
2013 - 《阿娜爾罕》
2014 - 《逆光之戀》
2015 - 《克拉戀人》
示例代碼:
package main import ( "encoding/json" "fmt" ) // Opus 作品 type Opus struct { Type string Title string } // Actress 女演員 type Actress struct { Name string Birthday string BirthPlace string Opus map[string]Opus } func main () { jsonData := []byte(`{ "name":"迪麗熱巴", "birthday":"1992-06-03", "birthPlace":"新疆烏魯木齊市", "opus":{ "2013":{ "Type":"近代革命劇", "Title":"《阿娜爾罕》" }, "2014":{ "Type":"奇幻劇", "Title":"《逆光之戀》" }, "2015":{ "Type":"愛情劇", "Title":"《克拉戀人》" } } }`) var actress Actress err := json.Unmarshal(jsonData, &actress) if err != nil { fmt.Println("error:", err) return } fmt.Printf("姓名:%s\n", actress.Name) fmt.Printf("生日:%s\n", actress.Birthday) fmt.Printf("出生地:%s\n", actress.BirthPlace) fmt.Println("作品:") for index, value := range actress.Opus { fmt.Printf("\t日期:%s\n", index) fmt.Printf("\t\t分類:%s\n", value.Type) fmt.Printf("\t\t標題:%s\n", value.Title) } }
運行結果:
姓名:迪麗熱巴
生日:1992-06-03
出生地:新疆烏魯木齊市
作品:
日期:2013
分類:近代革命劇
標題:《阿娜爾罕》
日期:2014
分類:奇幻劇
標題:《逆光之戀》
日期:2015
分類:愛情劇
標題:《克拉戀人》
我們先是介紹了Golang標準庫的encoding/json包中的Unmarshal函數,然后通過上面4個示例代碼,分別介紹了如何解碼以下4種JSON格式數據:
JSON格式1:
{ "name":"迪麗熱巴", "birthday":"1992-06-03", "birthPlace":"新疆烏魯木齊市", "opus":[ "《阿娜爾罕》", "《逆光之戀》", "《克拉戀人》" ] }
JSON格式2:
{ "name":"迪麗熱巴", "birthday":"1992-06-03", "birthPlace":"新疆烏魯木齊市", "opus":{ "Date":"2013", "Title":"《阿娜爾罕》" } }
JSON格式3:
{ "name":"迪麗熱巴", "birthday":"1992-06-03", "birthPlace":"新疆烏魯木齊市", "opus":[ { "date":"2013", "title":"《阿娜爾罕》" }, { "date":"2014", "title":"《逆光之戀》" }, { "date":"2015", "title":"《克拉戀人》" } ] }
JSON格式4:
{ "name":"迪麗熱巴", "birthday":"1992-06-03", "birthPlace":"新疆烏魯木齊市", "opus":{ "2013":{ "Type":"近代革命劇", "Title":"《阿娜爾罕》" }, "2014":{ "Type":"奇幻劇", "Title":"《逆光之戀》" }, "2015":{ "Type":"愛情劇", "Title":"《克拉戀人》" } } }
到此,相信大家對“Golang語言JSON解碼函數Unmarshal怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。