golang学習ノート---JSON
11991 ワード
JSONは構造体に解析した.
この部分を紹介する前に、Jsonの文法を簡単に紹介します.
JSON文法はJavaScript文法のサブセットです.JSON文法はJavaScriptの対象がフランス語法のサブセットを表しています.
データは名前/値ペアの中で、コンマ区切りの大かっこで保存されます.括弧保存配列1.JSON名前/値ペア
JSON配列JSON配列は、中かっこで書きます.配列は複数のオブジェクトを含みます.
JSONブール値
JSON null
復号:Jsonは構造体に解析されました.
JSONデータをGo言語に復号するデータ構造に対応し、Go言語では一般的にunmashlingと呼ばれ、Json.Unimasharl関数で完成します.
//JSON解析構造体例:
出力:
コーディング
一つの構造体をJSONに変える過程を編成といいます.編組はjson.Masharl関数を呼び出して完成しました.
このコンパクトな表示形式はすべての情報を含んでいますが、読みにくいです.読みやすいフォーマットを作るために、
もう一つのjson.Marsharl Indent関数は、きちんとインデントされた出力を生成します.関数には、各行の出力を表すプレフィックスと各階層のインデントが2つの追加の文字列パラメータがあります.
これは構成体のTagによるものである.構成体のメンバTagは、コンパイル段階でメンバに関連するメタ情報文字列である.
注:Json:「-」は序文化しないことを表します.
以下のコードはJSON形式の映画データを一つの構造体sliceに復号します.構造体はTitleのメンバーだけです.適切なGo言語データ構造を定義することにより、JSON中の関心のあるメンバーを選択的に復号することができる.Unimasharl関数が呼び戻されると、sliceはTitle情報値のみで満たされ、他のJSONメンバーは無視されます.
ストリームベースのデコーダjson.NewDecoderも使用できます.
JSON回転map
package manimport(“fmt”“encoding/json”)func main(){b:=[]byte('"""""""""""""""""""""name"":"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""」m)for k,v:=range m{fmt.Println(k,「-」,v)}出力結果:
m:map[IP:127..0.1 name:SKY]name:SKYIP:127..0.1
三、JSONを生成する
package manimport(「encoding/json」「fmt」)type Server stuct{ServerName sting`json:「serverName、string」`ServerIP string`json:「server IP,omitemipty」`typerServer Seversssssssversssssssssssssstucucucuct/Serrrrrrrrrrrrrrrrver ver ver ver ver ver ver ststststststststucucuct::(SeverververververversffffffffffffffffffffffffffffffServer{Server Name:「GungzhouBase」,Server IP:「127..0.1」}s.Servers=apped(s.Servers,Server Name:「Beijing uBase」,ServerIP:「127.02」)b,err:=Json.Masharl(s)if err!==nil{fmt.Println(「JSON ERR:」)
この部分を紹介する前に、Jsonの文法を簡単に紹介します.
JSON文法はJavaScript文法のサブセットです.JSON文法はJavaScriptの対象がフランス語法のサブセットを表しています.
データは名前/値ペアの中で、コンマ区切りの大かっこで保存されます.括弧保存配列1.JSON名前/値ペア
"name" : "value"
2.JSON値は、 ( )
( )
(true false)
( )
( )
null
JSONデータJSON数字は、整数または浮動小数点型であってもよい.{ "age":30 }
JSONオブジェクトJSONオブジェクトは、大括弧({})に書きます.オブジェクトは複数の名前/値ペアを含むことができます.{
"name": "runoob",
"alexa": 10000,
"sites": {
"site1": "www.runoob.com",
"site2": "m.runoob.com",
"site3": "c.runoob.com"
}
}
JSON配列JSON配列は、中かっこで書きます.配列は複数のオブジェクトを含みます.
{
"sites": [{
"name": " ",
"url": "www.runoob.com"
},
{
"name": "google",
"url": "www.google.com"
},
{
"name": " ",
"url": "www.weibo.com"
}
]
}
JSONブール値
{ "flag":true }
JSON null
{ "runoob":null }
復号:Jsonは構造体に解析されました.
JSONデータをGo言語に復号するデータ構造に対応し、Go言語では一般的にunmashlingと呼ばれ、Json.Unimasharl関数で完成します.
//JSON解析構造体例:
package main
import (
"encoding/json"
"fmt"
"reflect"
)
type Server struct {
ServerName string
ServerIP string
}
type Serverslice struct {
Servers []Server
}
func main() {
var s Serverslice
str := `{"servers":
[{"serverName":"Guangzhou_Base","serverIP":"127.0.0.1"},
{"serverName":"Beijing_Base","serverIP":"127.0.0.2"}]}`
fmt.Println("str type is : ", reflect.TypeOf(str))
err := json.Unmarshal([]byte(str), &s)
if err != nil {
fmt.Println(err)
}
fmt.Println(s)
fmt.Println(s.Servers[0].ServerName)
}
出力:
str type is : string
{[{Guangzhou_Base 127.0.0.1} {Beijing_Base 127.0.0.2}]}
Guangzhou_Base
コーディング
一つの構造体をJSONに変える過程を編成といいます.編組はjson.Masharl関数を呼び出して完成しました.
package main
import (
"encoding/json"
"fmt"
"log"
)
type Movie struct {
Title string
Year int `json:"released"`
Color bool `json:"color,omitempty"`
Actors []string
}
var movies = []Movie{
{Title: "Casablanca", Year: 1942, Color: false,
Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
{Title: "Cool Hand Luke", Year: 1967, Color: true,
Actors: []string{"Paul Newman"}},
{Title: "Bullitt", Year: 1968, Color: true,
Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
// ...
}
func main() {
data, err := json.Marshal(movies)
if err != nil {
log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s
", data)
}
出力:[{"Title":"Casablanca","released":1942,"Actors":["Humphrey Bogart","Ingrid Bergman"]},{"Title":"Cool Hand Luke","released":1967,"color":true,"Actors":["Paul Newman"]},{"Title":"Bullitt","released":1968,"color":true,"Actors":["Steve McQueen","Jacqueline Bisset"]}]
moviesの構造体sliceをJSONに変えて、Masharl関数はコード化されたバイトsliceを返します.長い文字列を含み、空白の字下げがありません.このコンパクトな表示形式はすべての情報を含んでいますが、読みにくいです.読みやすいフォーマットを作るために、
もう一つのjson.Marsharl Indent関数は、きちんとインデントされた出力を生成します.関数には、各行の出力を表すプレフィックスと各階層のインデントが2つの追加の文字列パラメータがあります.
package main
import (
"encoding/json"
"fmt"
"log"
)
type Movie struct {
Title string
Year int `json:"released"`
Color bool `json:"color,omitempty"`
Actors []string
}
var movies = []Movie{
{Title: "Casablanca", Year: 1942, Color: false,
Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
{Title: "Cool Hand Luke", Year: 1967, Color: true,
Actors: []string{"Paul Newman"}},
{Title: "Bullitt", Year: 1968, Color: true,
Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
// ...
}
func main() {
data2, err := json.MarshalIndent(movies, "", " ")
if err != nil {
log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s
", data2)
}
出力:[
{
"Title": "Casablanca",
"released": 1942,
"Actors": [
"Humphrey Bogart",
"Ingrid Bergman"
]
},
{
"Title": "Cool Hand Luke",
"released": 1967,
"color": true,
"Actors": [
"Paul Newman"
]
},
{
"Title": "Bullitt",
"released": 1968,
"color": true,
"Actors": [
"Steve McQueen",
"Jacqueline Bisset"
]
}
]
注意深い読者は、Yearの名前のメンバーがコード化されてreleasedになり、またColorのメンバーがコード化されて小文字で始まるカラーになっていることに気づいたかもしれません.これは構成体のTagによるものである.構成体のメンバTagは、コンパイル段階でメンバに関連するメタ情報文字列である.
Year int `json:"released"`
Color bool `json:"color,omitempty"`
構造体のメンバーTagは任意の文字列の面の値でも良いですが、通常は一連のスペースで区切られたkey:"value"キーのシーケンスです.値には二重引用符の文字が含まれているため、メンバーTagは通常、元の文字列の面の値で書かれています.jsonの先頭キーの値はencoding/jsonパケットの符号化と復号の動作を制御するために使用され、またencoding/…の下に他のパケットもこの約束に従う.メンバーTagにおけるjsonの対応値の第一部は、JSONオブジェクトの名前を指定するために使用され、例えば、Go言語のTotalCountメンバーをJSONのtotal gauに対応させるために使用される.countオブジェクトまた、ColorメンバーのTagは、Go言語構造体のメンバが空または0値のときにJSONオブジェクトを生成しないという追加のomitementオプションを持っている.案の定、キャサブランカは白黒映画で、Colorのメンバーを出力していません.注:Json:「-」は序文化しないことを表します.
以下のコードはJSON形式の映画データを一つの構造体sliceに復号します.構造体はTitleのメンバーだけです.適切なGo言語データ構造を定義することにより、JSON中の関心のあるメンバーを選択的に復号することができる.Unimasharl関数が呼び戻されると、sliceはTitle情報値のみで満たされ、他のJSONメンバーは無視されます.
package main
import (
"encoding/json"
"fmt"
"log"
)
type Movie struct {
Title string
Year int `json:"released"`
Color bool `json:"color,omitempty"`
Actors []string
}
var movies = []Movie{
{Title: "Casablanca", Year: 1942, Color: false,
Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
{Title: "Cool Hand Luke", Year: 1967, Color: true,
Actors: []string{"Paul Newman"}},
{Title: "Bullitt", Year: 1968, Color: true,
Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
// ...
}
func main() {
data, err := json.MarshalIndent(movies, "", " ")
if err != nil {
log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s
", data)
var titles []struct{ Title string }
if err := json.Unmarshal(data, &titles); err != nil {
log.Fatalf("JSON unmarshaling failed: %s", err)
}
fmt.Println(titles) // "[{Casablanca} {Cool Hand Luke} {Bullitt}]"
}
ストリームベースのデコーダjson.NewDecoderも使用できます.
// NewDecoder r
//
// , r JSON
//
func NewDecoder(r io.Reader) *Decoder
// Decode JSON ,
// v
//
// JSON Go ,
// Unmarshal
func (dec *Decoder) Decode(v interface{}) error
NewDecoder関数は、io.Readerインターフェースタイプの値をパラメータとして受け入れます.// This sample program demonstrates how to decode a JSON response
// using the json package and NewDecoder function.
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
)
type (
// gResult maps to the result document received from the search.
gResult struct {
GsearchResultClass string `json:"GsearchResultClass"`
UnescapedURL string `json:"unescapedUrl"`
URL string `json:"url"`
VisibleURL string `json:"visibleUrl"`
CacheURL string `json:"cacheUrl"`
Title string `json:"title"`
TitleNoFormatting string `json:"titleNoFormatting"`
Content string `json:"content"`
}
// gResponse contains the top level document.
gResponse struct {
ResponseData struct {
Results []gResult `json:"results"`
} `json:"responseData"`
}
)
func main() {
uri := "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=8&q=golang"
// Issue the search against Google.
resp, err := http.Get(uri)
if err != nil {
log.Println("ERROR:", err)
return
}
defer resp.Body.Close()
// Decode the JSON response into our struct type.
var gr gResponse
err = json.NewDecoder(resp.Body).Decode(&gr)
if err != nil {
log.Println("ERROR:", err)
return
}
fmt.Println(gr)
// Marshal the struct type into a pretty print
// version of the JSON document.
pretty, err := json.MarshalIndent(gr, "", " ")
if err != nil {
log.Println("ERROR:", err)
return
}
fmt.Println(string(pretty))
}
JSON回転map
package manimport(“fmt”“encoding/json”)func main(){b:=[]byte('"""""""""""""""""""""name"":"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""」m)for k,v:=range m{fmt.Println(k,「-」,v)}出力結果:
m:map[IP:127..0.1 name:SKY]name:SKYIP:127..0.1
三、JSONを生成する
package manimport(「encoding/json」「fmt」)type Server stuct{ServerName sting`json:「serverName、string」`ServerIP string`json:「server IP,omitemipty」`typerServer Seversssssssversssssssssssssstucucucuct/Serrrrrrrrrrrrrrrrver ver ver ver ver ver ver ststststststststucucuct::(SeverververververversffffffffffffffffffffffffffffffServer{Server Name:「GungzhouBase」,Server IP:「127..0.1」}s.Servers=apped(s.Servers,Server Name:「Beijing uBase」,ServerIP:「127.02」)b,err:=Json.Masharl(s)if err!==nil{fmt.Println(「JSON ERR:」)