GoでJSONデータを扱う: オブジェクトと配列を含むJSONからの値の取得方法

Go

はじめに

Go言語には標準パッケージであるencoding/json があります。このパッケージを使うことで、Go言語でJSONデータを簡単に取り扱うことができます。本記事では、具体的にオブジェクトと配列を含むJSONファイルからの値の取得方法を詳しく解説します。

流行りに乗ってGo言語を使ってみた(インストールからHelloWorld表示まで)

流行りに乗ってGo言語を使ってみた(インストールからHelloWorld表示まで)
Go言語とは 2009年、GoogleでRobert Griesemer、ロブ・パイク、ケン・トンプソンによって設計された。Goは、静的型付け、C言語の伝統に則ったコンパイル言語、メモリ安全性、ガベージコレクション、構造的型付け(英語版)、...

JSONとは

JSON(JavaScript Object Notation)は、データの構造化した形式の一つで、データ交換のフォーマットとして広く利用されています。JSONは人間にとって読み書きが容易で、マシンにとっても簡単にパースや生成を行うことができます。

GoでJSONを読み込む

まずは、シンプルなJSONファイルを読み込む例から始めましょう。以下のような user.json ファイルを考えます。

{
  "name": "Alice",
  "age": 25
}

このJSONファイルをGoで読み込むためには、まずこのJSONデータが表現する構造をGoの構造体(struct)で定義します。

type User struct {
  Name string `json:"name"`
  Age  int    `json:"age"`
}

そして、os.Open関数でファイルを開き、json.NewDecoderでJSONデコーダを作成します。そして、Decodeメソッドを使用してJSONデータをGoの構造体に変換します。

package main

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

type User struct {
  Name string `json:"name"`
  Age  int    `json:"age"`
}

func main() {
  file, err := os.Open("user.json")
  if err != nil {
    fmt.Println(err)
    return
  }
  defer file.Close()

  decoder := json.NewDecoder(file)

  var user User
  err = decoder.Decode(&user)
  if err != nil {
    fmt.Println(err)
    return
  }

  fmt.Println(user.Name, user.Age)  // Alice 25
}

このようにして、JSONファイルからGoの構造体へとデータを読み込むことができます。

オブジェクトと配列を含むJSONを扱う

次に、オブジェクトと配列を含むような複雑なJSONデータを読み込む方法を見ていきます。以下のような users.json ファイルを考えます。

{
  "users": [
    {
      "name": "Alice",
      "age": 25
    },
    {
      "name": "Bob",
      "age": 30
    }
  ]
}

このようなJSONデータをGoで読み込むためには、ネストされたオブジェクトと配列を表現できるような構造体を定義します。

type User struct {
  Name string `json:"name"`
  Age  int    `json:"age"`
}

type Users struct {
  Users []User `json:"users"`
}

ここで、Users構造体の中にUserのスライスを持つことで、JSONの配列を表現しています。その後のデコード処理は先程と同じです。

package main

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

type User struct {
  Name string `json:"name"`
  Age  int    `json:"age"`
}

type Users struct {
  Users []User `json:"users"`
}

func main() {
  file, err := os.Open("users.json")
  if err != nil {
    fmt.Println(err)
    return
  }
  defer file.Close()

  decoder := json.NewDecoder(file)

  var users Users
  err = decoder.Decode(&users)
  if err != nil {
    fmt.Println(err)
    return
  }

  for _, user := range users.Users {
    fmt.Println(user.Name, user.Age)
  }
  // Output:
  // Alice 25
  // Bob 30
}

以上のように、Goの標準パッケージ encoding/json を使えば、オブジェクトと配列を含む複雑なJSONデータも簡単に取り扱うことができます。JSONのデータ構造に合わせてGoの構造体を定義し、json.NewDecoderDecodeメソッドを使えば、JSONファイルの読み込みとGoのデータ構造への変換が行えます。

まとめ

今回は、Go言語でJSONデータを扱う基本的な方法について説明しました。特に、オブジェクトと配列を含むような複雑なJSONデータの取り扱いを紹介しました。Go言語でのJSONデータの取り扱いについては、これらの基本的な方法を理解しておくことが大切です。

リンク: Go言語公式サイト, Go言語のencoding/jsonパッケージ