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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

1回答

1546閲覧

構造体のフィールドがすべて空だった場合のomitemptyの挙動について

shukichi

総合スコア1

Go

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2022/09/22 02:20

前提

不勉強ですみませんGo勉強中で、現在Goで渡された値をjsonに入れ替えて、そのjsonで他の外部APIにリクエストする処理を実装しています。
対象のjsonに入れ替える際に、omitemptyタグの機能を利用して構造体に値が入っていない場合はそのフィールドを除外したいのですが、上手くいきません。

実現したいこと

構造体に値が入っていない場合は下記の通り構造体のフィールドを除外したいです。

Go

1######################## 2{"string_1":"D","string_2":"E"} 3########################

発生している問題・エラーメッセージ

Go

1######################## 2{"string_1":"D","string_2":"E","obj_1":{},"obj_2":{}} 3########################

該当のソースコード

Go

1package main 2 3import ( 4 "encoding/json" 5 "fmt" 6) 7 8type RequestJsonBody struct { 9 String1 string `json:"string_1,omitempty"` 10 String2 string `json:"string_2,omitempty"` 11 String3 string `json:"string_3,omitempty"` 12 Obj1 *obj1JsonBody `json:"obj_1,omitempty"` 13 Obj2 obj2JsonBody `json:"obj_2,omitempty"` 14} 15type obj1JsonBody struct { 16 Obj1string1 string `json:"obj1string_1,omitempty"` 17 Obj1string2 string `json:"obj1string_2,omitempty"` 18} 19type obj2JsonBody struct { 20 Obj2string1 uint32 `json:"obj2string_1,omitempty"` 21 Obj2string2 string `json:"obj2string_2,omitempty"` 22} 23 24func main() { 25 var varObj2string1 uint32 26 varObj2string1 = 0 27 varObj2string2 := "" 28 obj2JsonBody := obj2JsonBody{ 29 Obj2string1: varObj2string1, 30 Obj2string2: varObj2string2, 31 } 32 33 varObj1string1 := "" 34 varObj1string2 := "" 35 obj1JsonBody := obj1JsonBody{ 36 Obj1string1: varObj1string1, 37 Obj1string2: varObj1string2, 38 } 39 40 a := RequestJsonBody{ 41 String1: "D", 42 String2: "E", 43 String3: "", 44 Obj1: &obj1JsonBody, 45 Obj2: obj2JsonBody, 46 } 47 48 b, _ := json.Marshal(a) 49 fmt.Println("########################") 50 fmt.Println(string(b)) 51 fmt.Println("########################") 52}

補足情報(FW/ツールのバージョンなど)

Goのバージョンです
go version go1.18.1 linux/amd64

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

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

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

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

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

guest

回答1

0

Obj1はポインタ型ですので、nilを渡したときは省略されるはずです。
ポインタ型でない場合は構造体の全フィールドがゼロ値であっても構造体自体はゼロ値にはなりません。

この辺りはJSONシリアライザの仕様なので、nilを渡すか否かはアプリ側で対処する必要があります。

投稿2022/09/22 11:58

編集2022/09/24 11:03
nobonobo

総合スコア3367

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問