1
2

More than 3 years have passed since last update.

Goの構造体に連想配列を入れる。(可変長)

Last updated at Posted at 2021-08-17

以下のような構造のJsonを生成したかったのだけど、
自分にはあまりいい記事がなかったので書くことに。
Responseキーの中のリストは、可変します。

{
  "header": {
    "error_message": "",
    "status": "222"
  },
  "Response": [
    {
      "code": "111",
      "name": "1"
    },
    {
      "code": "111",
      "name": "2"
    },
    {
      "code": "111",
      "name": "3"
    }
  ]
}
{
  "header": {
    "error_message": "",
    "status": "222"
  },
  "Response": null
}

とりあえずコードです

※一部修正しました。

struct.go
package main

import (
    "encoding/json"
    "fmt"
    "strconv"
)

type CommonHeader struct {
    ErrorMessage string `json:"error_message"`

    Status string `json:"status"`
}

type ResultList struct {
    Header   CommonHeader `json:"header"`
    //Response ListB //親構造体で配列であることを示したほうが良い
    Response []ListB
}

type ListB struct {    //type ListB []struct { こういう書き方はあまりよくない
    Code string `json:"code,omitempty"`
    Name string `json:"name,omitempty"`
}

// 構造体に以下のようなデータを付けてJsonにしたい
// [{code:"111",name":"hoge"},{code:"222",name":"fuge"}]

func main() {
    //var aaa ListB 構造体変更したため、宣言方法も変更
    var aaa []ListB
    // 不定長のデータ構造をつける。
    for i := 1; i < 4; i++ {
        //fmt.Println(i)
        aaa = append(aaa, struct {
            Code string "json:\"code,omitempty\""
            Name string "json:\"name,omitempty\""
        }{Code: "111", Name: strconv.Itoa(i)})

    }
    //fmt.Println(aaa)
    //j, _ := json.Marshal(aaa)
    //fmt.Println(string(j))

    ////// struct生成(head)
    head := CommonHeader{
        ErrorMessage: "",
        Status:       "222",
    }
    // headとaaaを構造体にセット
    result := ResultList{
        Header:   head,
        Response: aaa,
    }

    //fmt.Println(result)
    //json化する
    result_j, _ := json.Marshal(result)

    fmt.Println(string(result_j))

}

Forループ内でaaaに連想配列をループ回数分(好きな)だけAppendします。

Print部分は確認用としてあえて残してあります。
変数名なんかも、どこがどこにつながるかわかるように分けてます。
(キー名と変数名が同じものとか、自分には見にくいので・・・。)

うまく書くと、いい感じに変数名とか省略されるので、一足飛びでGoを学ぼうとすると躓くことが多いです…。

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2