- JSON
- XML
- ASN.1
- Protocol Buffers
いろいろあるけどJSONはシンプルで読みやすいし、 サポートしてる環境が多い
Go には
- encoding/json
- encodeing/xml
- encoding/ans1
などの標準パッケージがあり、それぞれ類似したAPIをもっている
- json array
== encode ==>
GoのArray,Slice - json object
== encode ==>
Goのmap
type Movie struct {
Title string
Year int `json:"released"`
Color bool `json:"color,omitempty"`
Actors []string
}
var movies = []Movie{
{ Title : "aaa", Year : 1942, Color : false, Actors: []string{"aa","bb","cc"}},
{ Title : "aaa2", Color : false, Actors: []string{"aa","bb","cc"}},
}
data,err := json.Marshal(movies)
if err != nil {
fmt.Println("err %s", err)
}
fmt.Printf("%s\n", data)
[{"Title":"aaa","totalcount":10,"released":1942,"Actors":["aa","bb","cc"]},{"Title":"aaa2","totalcount":0,"released":0,"Actors":["aa","bb","cc"]}]
- 無関係なスペースはいっさいないので読みにくい
- json.MarshalIndentを使う
json.MarshalIndent(movie, "", " ")
- 第2引数がインデント幅 \t も可
- 第一引数はprefixつけれるけど使いどころは謎
- これはYearフィールドに
タグ
がついているせい。 - フィールドタグはコンパイル時に結びつけられるメタデータ
- フィールドタグはストリングリテラルで書く
- key:"value"のリストで書く
- json field tagはencoding/jsonのコントロール下であることを示していいる
- xml:"hoge"ならencoding/xml
- omitemptyはzero valueのときはjsonにoutputしない
- サンプルコードではColorフィールドがjsonにoutputされていない
- 指定キーだけGoデータ構造に変換
var titles []struct{ Title string }
if err := json.Unmarshal(data, &title); err != nil {}
fmt.Println(titles)
- Go構造体のフィールド名はかならず大文字始まり(Title string)
- jsonフィールドタグが必要ないケース
- jsonのkeyにundersocreが必要なとき以外は必要ない
- Goのfield名とjsonのkey名のunmarshalingのつながりは大小文字区別しない
jsonキーがtotalcount
のときは
var count []struct{ TotalCount int }
json.Unmarshal(data,&count)
- json.Unmarshalは指定したキーだけ取り出し
- json.Decoderは全体をとり出せる
- streaming decoder
- streamingといのはその場その場で様々なkeyに対応できるということ?
- もちろんjson.Encoderもある。