Skip to content

Instantly share code, notes, and snippets.

@tokubass
Last active July 10, 2016 16:06
Show Gist options
  • Save tokubass/35b9c33dee5f51a7309d7ea0b1f36f3d to your computer and use it in GitHub Desktop.
Save tokubass/35b9c33dee5f51a7309d7ea0b1f36f3d to your computer and use it in GitHub Desktop.
go4_json.md

JSON

  • JSON
  • XML
  • ASN.1
  • Protocol Buffers

いろいろあるけどJSONはシンプルで読みやすいし、 サポートしてる環境が多い

Go には

  • encoding/json
  • encodeing/xml
  • encoding/ans1

などの標準パッケージがあり、それぞれ類似したAPIをもっている

jsonとGoデータの対応関係

  • json array == encode ==> GoのArray,Slice
  • json object == encode ==> Goのmap

encoding/jsonパッケージ

goのデータ構造からjsonに変換

Marshal

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を使う

MarshalIndent

json.MarshalIndent(movie, "", " ")

  • 第2引数がインデント幅 \t も可
  • 第一引数はprefixつけれるけど使いどころは謎

フィールド名とJSONキー名の対応付け

Yearフィールドがjsonにoutputしたときにはreleasedになっている

  • これはYearフィールドにタグがついているせい。
  • フィールドタグはコンパイル時に結びつけられるメタデータ
  • フィールドタグはストリングリテラルで書く
  • key:"value"のリストで書く
  • json field tagはencoding/jsonのコントロール下であることを示していいる
  • xml:"hoge"ならencoding/xml

omitemptyオプション

  • omitemptyはzero valueのときはjsonにoutputしない
  • サンプルコードではColorフィールドがjsonにoutputされていない

json.Unmarshal

  • 指定キーだけ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.Decoder

  • json.Unmarshalは指定したキーだけ取り出し
  • json.Decoderは全体をとり出せる
  • streaming decoder
    • streamingといのはその場その場で様々なkeyに対応できるということ?
  • もちろんjson.Encoderもある。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment