JSON-TO-GO を使えば、GO 構造体定義がすこぶる簡単！


## Teratail の質問 API

プログラミングに関する質問ができる Teratail では、API を提供しています。

https://teratailv1.docs.apiary.io/#reference/(question)/0/0

質問一覧では、下記のようなレスポンスが返ってくるとのことです。

これを一つ一つ Go の構造体を作成するのは結構時間がかかる。。


```json
{
  "meta": {
    "message": "success",
    "total_page": 1,
    "page": 1,
    "limit": 10,
    "hit_num": 2
  },
  "questions": [
    {
      "id": 10364,
      "title": "インデントにタブを使うことのデメリット",
      "created": "2015-05-27 04:49:55",
      "modified": "2015-06-22 15:17:06",
      "count_reply": 11,
      "count_clip": 11,
      "count_pv": 0,
      "is_beginner": false,
      "is_accepted": false,
      "is_presentation": false,
      "tags": [
        "Eclipse",
        "タブ",
        "プログラミング言語",
        "コーディング規約"
      ],
      "user": {
        "display_name": "miu_ras",
        "photo": "https://cdn.teratail.com/uploads/avatars/15047/4DVbsgOW_thumbnail.jpg",
        "score": 101
      }
    },
    {
      "id": 9399,
      "title": "mysqlに格納された配列データで絞り込みをかけることはできるのでしょうか？",
      "created": "2015-05-04 15:59:29",
      "modified": "2015-05-04 15:59:29",
      "count_reply": 2,
      "count_clip": 0,
      "count_pv": 0,
      "is_beginner": true,
      "is_accepted": true,
      "is_presentation": false,
      "tags": [
        "MySQL"
      ],
      "user": {
        "display_name": "mendosa",
        "photo": "https://tt4.leverages.org/uploads/avatars/13696/4WwsssAn_thumbnail.jpg",
        "score": 7
      }
    }
  ]
}
```

そこで使うのが、[JSON-To-GO](https://mholt.github.io/json-to-go/) 。

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


## さっそく JSON-TO-GO に貼り付ける

単純にコピペするだけで、構造体を作ってくる

![Screen Shot 2021-07-31 at 22.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157574/35566b3c-cb34-bbaa-4c5a-04cc46448e87.png)

### インラインでネストした場合

```go
type AutoGenerated struct {
	Meta struct {
		Message   string `json:"message"`
		TotalPage int    `json:"total_page"`
		Page      int    `json:"page"`
		Limit     int    `json:"limit"`
		HitNum    int    `json:"hit_num"`
	} `json:"meta"`
	Questions []struct {
		ID             int      `json:"id"`
		Title          string   `json:"title"`
		Created        string   `json:"created"`
		Modified       string   `json:"modified"`
		CountReply     int      `json:"count_reply"`
		CountClip      int      `json:"count_clip"`
		CountPv        int      `json:"count_pv"`
		IsBeginner     bool     `json:"is_beginner"`
		IsAccepted     bool     `json:"is_accepted"`
		IsPresentation bool     `json:"is_presentation"`
		Tags           []string `json:"tags"`
		User           struct {
			DisplayName string `json:"display_name"`
			Photo       string `json:"photo"`
			Score       int    `json:"score"`
		} `json:"user"`
	} `json:"questions"`
}
```

### ネストしない場合

```go
type AutoGenerated struct {
	Meta      Meta        `json:"meta"`
	Questions []Questions `json:"questions"`
}
type Meta struct {
	Message   string `json:"message"`
	TotalPage int    `json:"total_page"`
	Page      int    `json:"page"`
	Limit     int    `json:"limit"`
	HitNum    int    `json:"hit_num"`
}
type User struct {
	DisplayName string `json:"display_name"`
	Photo       string `json:"photo"`
	Score       int    `json:"score"`
}
type Questions struct {
	ID             int      `json:"id"`
	Title          string   `json:"title"`
	Created        string   `json:"created"`
	Modified       string   `json:"modified"`
	CountReply     int      `json:"count_reply"`
	CountClip      int      `json:"count_clip"`
	CountPv        int      `json:"count_pv"`
	IsBeginner     bool     `json:"is_beginner"`
	IsAccepted     bool     `json:"is_accepted"`
	IsPresentation bool     `json:"is_presentation"`
	Tags           []string `json:"tags"`
	User           User     `json:"user"`
}
```