golang学習ノート---JSON

11991 ワード

JSONは構造体に解析した.
この部分を紹介する前に、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:」)