Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

GoでJSONをパースする

議事録のテンプレート的なことは、JSONで指定することにした。こんな感じ

{
      "会議名": "セッション0312",
      "開催日時": "2019年3月12日(火)14:00 – 17:00",
      "場所": "本社10F会議室",
      "出席者": {
        "ABC": ["安倍", "麻生", "石田", "山下", "河野"],
        "XYZ": ["柴山", "根本", "吉川", "世耕", "石井"]
      },
      "ToDo":[
        "概算見積の準備(XYZ)",
        "稟議書の準備(ABC)"
      ],
      "決定事項": [
        "検討の優先順位"
      ]
}

さて、これをGoで読み込んでみる。Rubyで読むと単にHashになって返ってくるだけなんだけども、Goのスタイルはこれに対応する構造体を作るらしい。 なるほど。

とはいうものの、とりあえずmapに読ませてみる。

import (
    "encoding/json"
    "fmt"
    "log"
)

func main() {
    data := []byte(
`{
  "会議名": "セッション0312",
  "開催日時": "2019年3月12日(火)14:00 – 17:00",
  "場所": "本社10F会議室"

}`)

    var m map[string]string
    err := json.Unmarshal(data, &m)
    if err != nil {
        log.Fatal(err)
    }

    for key, value := range m {
        fmt.Println(key, ":", value)
    }
}

これで単純にvalueがstringのところは読めるみたい。うん。便利じゃん?

とはいえ、これでは全体は読めないのでこんな感じにしてみる。

func main() {
    data := []byte(
        `{
  "会議名": "セッション0312",
  "開催日時": "2019年3月12日(火)14:00 – 17:00",
  "場所": "本社10F会議室",
  "出席者": {
      "ABC": ["安倍", "麻生", "石田", "山下", "河野"],
      "XYZ": ["柴山", "根本", "吉川", "世耕", "石井"]
  },
  "ToDo":[
      "概算見積の準備(XYZ)",
      "稟議書の準備(ABC)"
  ],
  "決定事項": [
      "検討の優先順位"
  ]
}`)

    type Meeting struct {
        Name      string              `json:"会議名"`
        Date      string              `json:"開催日時"`
        Room      string              `json:"場所"`
        Members   map[string][]string `json:"出席者"`
        Todo      []string            `json:"ToDo"`
        Decisions []string            `json:"決定事項"`
    }

    var m Meeting
    err := json.Unmarshal(data, &m)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(m)

}

うん、ちゃんとパース出来ているね。