m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

golangでjsonのデータを出力する

一気に気温が上がったり、下がったり大変

安定せんかな〜

jsonでデータを出力する

まあ、今回は単純にjsonを出す

実装1(シンプルな構造体)

main1.go
package main

import (
	"fmt"
	"net/http"
	"log"
	"github.com/gorilla/mux"
	"encoding/json"
)

// 単純な構造体
type Data1 struct {
	Title    string `json:"title"`
	Message  string `json:"message"`
	Status   int    `json:"status"`
}

func main(){

	// ルーティング
	router := mux.NewRouter()

	// URL別設定
	router.HandleFunc("/sample1", func(w http.ResponseWriter, r  *http.Request){

		// 構造体を定義
		var data1 = Data1{}
		data1.Title = "sample1"
		data1.Message = "hello, sample1"
		data1.Status = 100

		// jsonエンコード
		outputJson, err := json.Marshal(&data1)
		if err != nil {
			panic(err)
		}

		// jsonヘッダーを出力
		w.Header().Set("Content-Type", "application/json")

		// jsonデータを出力
		fmt.Fprint(w, string(outputJson))

		// log
		log.Print(r.URL.Path)
	})

	// ハンドル割当
	http.Handle("/", router)

	// log
	log.Print("localhost:9001")

	// ポート
	http.ListenAndServe(":9001", nil)

}

f:id:m_shige1979:20160216215650p:plain

実装2(構造体に配列を含む)

main2.go
package main

import (
	"fmt"
	"net/http"
	"log"
	"github.com/gorilla/mux"
	"encoding/json"
)

// 配列を含む構造体
type Data2 struct {
	Title    string `json:"title"`
	Message  string `json:"message"`
	Status   int    `json:"status"`
	List	 map[string]Item `json:"list"`
}

// 構造体の配列Item
type Item struct {
	Name     string `json:"name"`
	Age      int    `json:"age"`
}

func main(){

	// ルーティング
	router := mux.NewRouter()

	// URL別設定
	router.HandleFunc("/sample2", func(w http.ResponseWriter, r  *http.Request){

		// 構造体を定義
		var data2 = Data2{}
		data2.Title = "sample2"
		data2.Message = "hello, sample2"
		data2.Status = 200
		data2.List = map[string]Item{}
		data2.List["test1"] = Item{Name:"taro", Age: 10}
		data2.List["test2"] = Item{Name:"hanako", Age: 18}
		data2.List["test3"] = Item{Name:"pochi", Age: 50}

		// jsonエンコード
		outputJson, err := json.Marshal(&data2)
		if err != nil {
			panic(err)
		}

		// jsonヘッダーを出力
		w.Header().Set("Content-Type", "application/json")

		// jsonデータを出力
		fmt.Fprint(w, string(outputJson))

		// log
		log.Print(r.URL.Path)
	})

	// ハンドル割当
	http.Handle("/", router)

	// log
	log.Print("localhost:9001")

	// ポート
	http.ListenAndServe(":9001", nil)

}

f:id:m_shige1979:20160216215705p:plain

なんとかできました。
RSSの場合にもあったけど

type Data2 struct {
	Title    string `json:"title"`
	Message  string `json:"message"`
	Status   int    `json:"status"`
	List	 map[string]Item `json:"list"`
}

右の方にjsonとか指定したらその名前になるので小文字にしたい場合などは役に立ちます…というかきまりみたいな感じかな…
テキトーにググったけどそれっぽいパッケージが見つからなかったのでこれでいいはず