Go 構造体を JSON に変換する方法

Suraj Joshi 2021年8月10日 2020年6月12日 Go Go JSON Go Struct
  1. Go 構造体を JSON に変換する
  2. Go でのネストされた構造体の JSON への変換
  3. Go の構造体から JSON への変換でのインデント
Go 構造体を JSON に変換する方法

JSON は、データを保存および転送するための、言語に依存しない軽量な形式です。Go では、encoding/json パッケージを使用しています。これには、JSON 関連の操作用の組み込みメソッドが多数含まれています。マーシャリングを使用して、構造体データを JSON に変換できます。

Go 構造体を JSON に変換する

marshal メソッドは struct オブジェクトを受け取り、エンコードされたデータのバイトスライスを返します。これを Go で JSON に変更できます。

package main

import (
    "encoding/json"
    "fmt"
)

type Employee struct {
    Name   string `json:"empname"`
    Number int    `json:"empid"`
}

func main() {
    employee_1 := &Employee{Name: "Dixya Lhyaho", Number: 10}
    e, err := json.Marshal(employee_1)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(e))
}

出力:

{"empname":"Dixya Lhyaho","empid":10}

Number プロパティを number に変更すると、json/encoding パッケージはそれを認識できないため、マーシャリングプロセスで number は無視されます。

package main

import (
    "encoding/json"
    "fmt"
)

type Employee struct {
    Name   string `json:"empname"`
    number int    `json:"empid"`
}

func main() {
    employee_1 := &Employee{Name: "Dixya Lhyaho", number: 10}
    e, err := json.Marshal(employee_1)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(e))
}

出力:

{"empname":"Dixya Lhyaho"}

Go でのネストされた構造体の JSON への変換

ネストされた構造体でより複雑な構造体を定義しましょう。構造体の定義内で、構造体のフィールドをマーシャリングされた JSON のフィールドに直接マップする JSON タグを定義します。

package main

import (
    "encoding/json"
    "fmt"
)

type Employee struct {
    Position string `json:"position"`
    Name     Name   `json:"name"`
}

type Name struct {
    FirstName string `json:"firstname"`
    Surname   string `json:"surname"`
}

func main() {
    name := Name{FirstName: "Dikxya", Surname: "Lhyaho"}
    employee := Employee{Position: "Senior Developer", Name: name}

    byteArray, err := json.Marshal(employee)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(string(byteArray))
}

出力:

{"position":"Senior Developer","name":{"firstname":"Dikxya","surname":"Lhyaho"}}

Go の構造体から JSON への変換でのインデント

json.Marshal() 関数の代わりに json.MarshalIndent() 関数を使用して、JSON をより読みやすい形式で出力できます。2つの追加の引数、prefix stringindent stringMarshalIndent に渡します。

package main

import (
    "encoding/json"
    "fmt"
)

type Employee struct {
    Position string `json:"position"`
    Name     Name   `json:"name"`
}

type Name struct {
    FirstName string `json:"firstname"`
    Surname   string `json:"surname"`
}

func main() {
    name := Name{FirstName: "Dikxya", Surname: "Lhyaho"}
    employee := Employee{Position: "Senior Developer", Name: name}

    byteArray, err := json.MarshalIndent(employee, "", "  ")
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(string(byteArray))
}

出力:

{
  "position": "Senior Developer",
  "name": {
    "firstname": "Dikxya",
    "surname": "Lhyaho"
  }
}

関連記事 - Go Struct

  • Go のコンソールで構造体変数を出力する方法