質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

946閲覧

構造体からJSONを生成したいのですが、構造体の継承的な部分が実現できず困っています。

Gunjirk

総合スコア23

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/06/29 00:52

編集2020/06/29 07:05

実現したいこと

以下のJSONを出力する

//理想のJSON { "command": "ENT", "table": [ { "table_name": "basic", "clientid": 0, "server": "basic" }, { "table_name": "contents", "clientid": 0, "time_control": "0" } ] }
//現在のJSON { "command": "ENT", "table": [ { "Table1": { "table_name": "basic", "clientid": 0, "server": "basic" }, "Table2": { "table_name": "contents", "clientid": 0, "time_control": 0 } } ] }

"Table1": {
"Table2": {
の部分が不要なのですが、どうしても消せません。。。

プログラムは以下です。
異なる構造体をまとめて、リテラルスライスで出力しようとしています。

GO

1package main 2 3import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7) 8 9//Command ENT 10type Command struct { 11 Command string `json:"command"` 12 Tables []Table `json:"table"` 13} 14 15//Table Data 16type Table1 struct { 17 TableName string `json:"table_name"` 18 Clientid int `json:"clientid"` 19 Server string `json:"server"` 20} 21 22type Table2 struct { 23 TableName string `json:"table_name"` 24 Clientid int `json:"clientid"` 25 TimeControl int `json:"time_control"` 26} 27 28type Table struct { 29 Table1 Table1 30 Table2 Table2 31} 32 33func main() { 34 BasicConfig := Table1{TableName: "basic", Clientid: 0, Server: "basic"} 35 ContentsFunc := Table2{TableName: "contents", Clientid: 0, TimeControl: 0} 36 jsonStr := Command{ 37 Command: "ENT", 38 Tables: []Table{ 39 { 40 BasicConfig, 41 ContentsFunc, 42 }, 43 }, 44 } 45 46 jsonBytes, err := json.Marshal(jsonStr) 47 if err != nil { 48 fmt.Println("JSON Marshal error:", err) 49 return 50 } 51 out := new(bytes.Buffer) 52 // プリフィックスなし、スペース4つでインデント 53 json.Indent(out, jsonBytes, "", " ") 54 fmt.Println(out.String()) 55} 56

よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

sliceにリテラルで挿入する構文が間違っています。正しくは以下のようになります。(main関数のみ記載)

go

1func main() { 2 BasicConfig := Table1{TableName: "basic", Clientid: 0, Server: "basic"} 3 ContentsFunc := Table2{TableName: "contents", Clientid: 0, TimeControl: 0} 4 jsonStr := Command{ 5 Command: "ENT", 6 Tables: []Table{ 7 { 8 table1: BasicConfig, 9 table2: ContentsFunc, 10 }, 11 }, 12 } 13 14 jsonBytes, err := json.Marshal(jsonStr) 15 if err != nil { 16 fmt.Println("JSON Marshal error:", err) 17 return 18 } 19 fmt.Println(jsonBytes) 20}

投稿2020/06/29 01:00

d_tutuz

総合スコア730

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

d_tutuz

2020/06/29 01:01

ご存知だとは思いますが table1, table2 は省略できます
Gunjirk

2020/06/29 01:16 編集

ありがとうございます! エラーは起きなくなりました! あと少し教えていただきたいのですが、出力すると以下のようにJSONが空でした・・・。 対処法を教えてただきたいです。 コメントのインデントのやり方がわからないので、少し観づらいです。すみません { "command": "ENT", "table": [ {} ] }
d_tutuz

2020/06/29 03:42

Table構造体のフィールドをExportすれば参照できます type Table struct { Table1 Table1 Table2 Table2 } (※teratailのコメントはformatがきかない仕様ので、見ずらいです)
Gunjirk

2020/06/29 04:04

d_tutuzさん、おかげ様で期待する動作をするようになりました! 本当にありがとうございます! GO勉強中ですので、フォローさせていただきます。 これからもよろしくお願い致します。
Gunjirk

2020/06/29 07:03

出力結果が少し違っていたので、質問内容を修正させていただきました。 ご確認お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問