http://www.tuicool.com/articles/BFruI3
go语言提供一个json解析的包。见 http://golang.org/pkg/encoding/json/
官方同时提供了一篇文章 JSON and Go 讲述json包的用法, 该文章同时存在中文翻译: JSON与Go 。
看过上述两篇文章后,基本使用应该就没问题了。
同时,贴几个官方的例子,方便理解。
Decoder:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
package main import ( "encoding/json" "fmt" "io" "log" "strings" ) func main ( ) { const jsonStream = ` { "Name" : "Ed" , "Text" : "Knock knock." } { "Name" : "Sam" , "Text" : "Who's there?" } { "Name" : "Ed" , "Text" : "Go fmt." } { "Name" : "Sam" , "Text" : "Go fmt who?" } { "Name" : "Ed" , "Text" : "Go fmt yourself!" } ` type Message struct { Name , Text string } dec := json. NewDecoder ( strings. NewReader ( jsonStream ) ) for { var m Message if err := dec. Decode ( & m ) ; err == io. EOF { break } else if err != nil { log . Fatal ( err ) } fmt. Printf ( "%s: %s \n " , m. Name , m. Text ) } }
|
Marshal:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
package main import ( "encoding/json" "fmt" "os" ) func main ( ) { type ColorGroup struct { ID int Name string Colors [ ] string } group := ColorGroup { ID : 1 , Name : "Reds" , Colors : [ ] string { "Crimson" , "Red" , "Ruby" , "Maroon" } , } b , err := json. Marshal ( group ) if err != nil { fmt. Println ( "error:" , err ) } os. Stdout . Write ( b ) }
|
RawMessage :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
package main import ( "encoding/json" "fmt" "log" ) func main ( ) { type Color struct { Space string Point json. RawMessage // delay parsing until we know the color space } type RGB struct { R uint8 G uint8 B uint8 } type YCbCr struct { Y uint8 Cb int8 Cr int8 } var j = [ ] byte ( ` [ { "Space" : "YCbCr" , "Point" : { "Y" : 255 , "Cb" : 0 , "Cr" : - 10 } } , { "Space" : "RGB" , "Point" : { "R" : 98 , "G" : 218 , "B" : 255 } } ] ` ) var colors [ ] Color err := json. Unmarshal ( j , & colors ) if err != nil { log . Fatalln ( "error:" , err ) } for _ , c := range colors { var dst interface { } switch c. Space { case "RGB" : dst = new ( RGB ) case "YCbCr" : dst = new ( YCbCr ) } err := json. Unmarshal ( c. Point , dst ) if err != nil { log . Fatalln ( "error:" , err ) } fmt. Println ( c. Space , dst ) } }
|
Unmarshal:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
package main import ( "encoding/json" "fmt" ) func main ( ) { var jsonBlob = [ ] byte ( ` [ { "Name" : "Platypus" , "Order" : "Monotremata" } , { "Name" : "Quoll" , "Order" : "Dasyuromorphia" } ] ` ) type Animal struct { Name string Order string } var animals [ ] Animal err := json. Unmarshal ( jsonBlob , & animals ) if err != nil { fmt. Println ( "error:" , err ) } fmt. Printf ( "%+v" , animals ) }
|
有疑问加站长微信联系(非本文作者)