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

Suraj Joshi 2023年1月30日
  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"
  }
}
著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

関連記事 - Go JSON

関連記事 - Go Struct