【Go】JSONから構造体が生成できるJSON-to-Goを紹介

## はじめに

こんにちは、なかじです！

GoでWEB開発する際、JSONデータを扱うことが多いと思います！

JSONデータをGoの構造体に変換するのは、面倒なときがあると思います。

そこで役立つのが、「**JSON-to-Go**」というツールです！

今回の記事では、この「JSON-to-Go」を紹介したいと思います！

## 😃 JSON-to-Goとは？

こちらが、今回紹介するJSON-to-Goです。

https://mholt.github.io/json-to-go/

## 😃 使用方法

今回はダミーでデータを用意します

<img width="700px" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/6d044869-d931-9c63-9d64-4da5dea3244a.gif">

```go
[
  {
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "name": "string",
    "email": "user@example.com",
    "createdAt": "2023-12-19T18:11:46.975Z",
    "profile": {
      "avatarUrl": "string",
      "bio": "string",
      "location": "string",
      "website": "string"
    },
    "roles": [
      {
        "roleId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "roleName": "string"
      }
    ],
    "settings": {
      "language": "string",
      "timezone": "string",
      "notificationsEnabled": true
    }
  }
]
```

ここから、

```go
type AutoGenerated []struct {
	ID        string    `json:"id"`
	Name      string    `json:"name"`
	Email     string    `json:"email"`
	CreatedAt time.Time `json:"createdAt"`
	Profile   Profile   `json:"profile"`
	Roles     []Roles   `json:"roles"`
	Settings  Settings  `json:"settings"`
}

type Profile struct {
	AvatarURL string `json:"avatarUrl"`
	Bio       string `json:"bio"`
	Location  string `json:"location"`
	Website   string `json:"website"`
}

type Roles struct {
	RoleID   string `json:"roleId"`
	RoleName string `json:"roleName"`
}

type Settings struct {
	Language             string `json:"language"`
	Timezone             string `json:"timezone"`
	NotificationsEnabled bool   `json:"notificationsEnabled"`
}
```

が生成できます！

### Inline type definitions（インライン型定義）

![スクリーンショット 2023-12-21 16.31.18（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/9d463e37-b573-9761-b22c-3f076a73be14.png)

JSONからGoのデータ構造への変換Goのデータ構造からJSONへの変換を行う際に、一時的な型を定義する方法です。

これにより、構造体を事前に定義することなく、直接型をインラインで定義してJSONとの相互作用を行うことができます。

上のコードだと、以下のように生成されます！

```go
type AutoGenerated []struct {
	ID        string    `json:"id"`
	Name      string    `json:"name"`
	Email     string    `json:"email"`
	CreatedAt time.Time `json:"createdAt"`
	Profile   struct {
		AvatarURL string `json:"avatarUrl"`
		Bio       string `json:"bio"`
		Location  string `json:"location"`
		Website   string `json:"website"`
	} `json:"profile"`
	Roles []struct {
		RoleID   string `json:"roleId"`
		RoleName string `json:"roleName"`
	} `json:"roles"`
	Settings struct {
		Language             string `json:"language"`
		Timezone             string `json:"timezone"`
		NotificationsEnabled bool   `json:"notificationsEnabled"`
	} `json:"settings"`
}
```


### omitempty

![スクリーンショット 2023-12-21 16.31.21（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/7c8d152c-9caa-9530-aeea-cb3653167fa4.png)

Go言語でJSONのシリアライズ（構造体をJSONに変換）する際に使われるタグの一つです！

構造体のフィールドがゼロ値（空の文字列、0、nilなど）の場合に、そのフィールドをJSONに含めないようにするために使用されます。

```go
type Example struct {
    Name    string `json:"name"`
    Age     int    `json:"age"`
    Address string `json:"address,omitempty"`
}
```

`Address` フィールドのタグについて、`json:"address,omitempty"` というタグが使われています。

`Address` フィールドがゼロ値（例えば空の文字列）であった場合、生成されるJSONには`address`フィールドが含まれません。

JSONのサイズを小さく保つためや、不要なデータを送信しないために役立ちます！

## 😃 その他

### VSCode版もありますw

https://marketplace.visualstudio.com/items?itemName=maracko.json-to-go

### 姉妹ツールも（****curl-to-Go****）

また、JSON-to-Goと同様に、curlコマンドをGoのコードに変換する「**curl-to-Go**」というツールも存在します！ぜひ！

https://mholt.github.io/curl-to-go/

## おわりに

今回は、JSONから構造体が生成できるJSON-to-Goを紹介しました。

このツールのおかげで、JSONデータをGoの構造体に変換するのを楽にできそうですね！

## PR

HRBrainでは一緒に働いてくれる仲間を募集しています！😁

https://www.hrbrain.co.jp/recruit