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

Suraj Joshi 2023年1月30日 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"
  }
}
チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

関連記事 - Go JSON

関連記事 - Go Struct