エンジニアもどきの雑記

メモ帳です。きっと。macアプリ配信windowsでもできるようになるまで絶対にメイン機にしないマン。特筆しない限り環境は【win10home,i5-7200u,8g,64bit,巨乳が好き】

Goのencoding/jsonを使ってみる


Goでapiサーバーを作るんだけど、
その上で必須ともいえるjsonエンコードについて少し学ぶ。


json - The Go Programming Language

デコードするにはUnmarshalを利用する。
エンコードするにはMarshal

とりあえず使用するためにImportする

import "encoding/json"


形成用、受け取り用の構造体の定義
今回はよくあるUserで

 type User struct {
      Id int `json:"id"`
      Name string `json:"name"`
      Email string `json:"email"`
  }


それぞれの後ろのついているのはタグjson:"hoge"
これを指定してやることで、Idではなくidjsonを整えてくれる。
そういう機能。

今回はどこからか取得するわけではないので、
同じファイル内にサンプルを置いておく。
以下

 var sampleJson = `
[
{
        "id": 1,
        "name": "hoge",
        "email": "hogehoge@hoge.com"
},
{
        "id": 2,
        "name": "fuga",
        "email": "fugafuga@fuga.com"
},
{
        "id": 3,
        "name": "foo",
        "email": "foofoo@foo.com"
}
]
`



とりあえずUnmarshalしてみる

package main

import (
        "encoding/json"
        "fmt"
)

type User struct {
        Id    int    `json:"id"`
        Name  string `json:"name"`
        Email string `json:"email"`
}

var sampleJson = `
[
{
        "id": 1,
        "name": "hoge",
        "email": "hogehoge@hoge.com"
},
{
        "id": 2,
        "name": "fuga",
        "email": "fugafuga@fuga.com"
},
{
        "id": 3,
        "name": "foo",
        "email": "foofoo@foo.com"
}
]
`

func main() {
        jsonData := ([]byte)(sampleJson)
        var user []User
        if err := json.Unmarshal(jsonData, &user); err != nil {
                fmt.Println(err)
                return
        }

        for _, u := range user {
                fmt.Println(u.Id, u.Name, u.Email)
        }
}


結果

[(゜-゜):daichi]@:json_test$ go run main.go
1 hoge hogehoge@hoge.com
2 fuga fugafuga@fuga.com
3 foo foofoo@foo.com


なんかjsonの宣言にすげぇ時間とられた。,とか諸々でエラーでまくってて悩んでた。

デコードでけた。

じゃあMarshalもやってみる。

上記コードのuserが以下

[{1 hoge hogehoge@hoge.com} {2 fuga fugafuga@fuga.com} {3 foo foofoo@foo.com}]

なのでそのまま利用してみる
先ほどはったMarshalのリンク先を見ると、Marshalの引数はinterface{}であることがわかる。
func Marshal(v interface{}) ([]byte, error)

とりあえず突っ込むものを作ってそれからやることにする。

package main

import (
        "encoding/json"
        "fmt"
)

type User struct {
        Id    int    `json:"id"`
        Name  string `json:"name"`
        Email string `json:"email"`
}

var sampleJson = `
[
{
        "id": 1,
        "name": "hoge",
        "email": "hogehoge@hoge.com"
},
{
        "id": 2,
        "name": "fuga",
        "email": "fugafuga@fuga.com"
},
{
        "id": 3,
        "name": "foo",
        "email": "foofoo@foo.com"
}
]
`

type mapSli []User

func main() {
        jsonData := ([]byte)(sampleJson)
        var user []User
        if err := json.Unmarshal(jsonData, &user); err != nil {
                fmt.Println(err)
                return
        }

        var jsonArr mapSli
        for _, u := range user {
                jsonArr = append(jsonArr, User{
                        Id:    u.Id,
                        Name:  u.Name,
                        Email: u.Email,
                })
        }

        s, err := json.Marshal(jsonArr)
        if err != nil {
                fmt.Println(err)
                return
        }

        fmt.Println(string(s))
}


そうしてできたのがこちら。
go難しい・・・
まだまだよくわかってないんだなぁ、と書いてて思う。
頑張ろう

そして実行

[(゜-゜):daichi]@:json_test$ go run main.go
[{"id":1,"name":"hoge","email":"hogehoge@hoge.com"},{"id":2,"name":"fuga","email":"fugafuga@fuga.com"},{"id":3,"name":"foo","email":"foofoo@foo.com"}]


ういい。
type mapSli []Userを宣言。いちいちtypeにしなくてもよかっただろうけどゆるちて。いろいろやりたい年ごろ。

unmarshalで作ったuserをjsonArrに代入。これでスライスになる。
準備はできたので、そのスライスをMarshalする。それを表示。
以上!

ういうい。
毎日少しずつでも頑張る

巨乳のお姉さんに手取り足取りgoを教えてもらいたい。