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

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

新規登録して質問してみよう
ただいま回答率
85.44%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

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

JSON

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Q&A

解決済

1回答

2995閲覧

Go (Echo) で複雑な構造のJSON(POSTリクエスト)からデータを取得したい

whitehackerh

総合スコア2

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

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

JSON

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

1グッド

0クリップ

投稿2022/08/14 12:18

編集2022/08/14 14:21

前提

フロントエンドはVue.js
バックエンドはGo で フレームワークはEcho を使用しています。

実現したいこと

  • POSTリクエストのデータを受け取れるようにする (特に二次元配列かつ連想配列の箇所)

  Context.Bindで構造体にマッピングする以外にデータを受け取れる方法があれば何でも構いません。

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

うまくデータを取得することができません

以下はリクエストの中身です

{"body":{"user_id":"3","expectations":[{"time":"1","input_number_1":"1","input_number_2":"2","input_number_3":"3","input_number_4":"4","input_number_5":"5","input_number_6":"6",},{"time":"2","input_number_1":"1","input_number_2":"2","input_number_3":"3","input_number_4":"4","input_number_5":"5","input_number_6":"6"]}}

試したこと

Go

1type 構造体名 struct { 2 Body struct { 3 UserID string `json:"user_id"` 4 Expectations map[int]map[string]string `json:"expectations"`   // ※可変長です。UI的には行追加ボタンを押して何行でも入力できるイメージ 5 } `json:"body"` 6}

上記の構造体に Context.Bind をしました。
その結果UserIDの部分は取れているのですが、
Expectations のところで fmt.Println(構造体名.Body.Expectations[index]["キー名"])
実行してみてもなにも表示されない状態です。

上記以外にhttp.Request の ParseFormやPostForm, PostFormValue など試してみましたが、いずれも
うまくいきませんでした。

blossam_code👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

expectationsキーフィールドの値は「JSONのArray」タイプですので、
コード例に記述したmap[int]Tでは受け取れません。[]Tで受け取りましょう。
JSの世界ではObjectとArrayの差がインデックスが整数かどうかで似た扱いができちゃうのに対し、
GoでのSliceとMapは全く異なる扱いです。

あと例示のJSONはJSONの規約とあっていないところがありました!

改善例:

https://go.dev/play/p/UNnz01Yk9eq

go

1package main 2 3import ( 4 "encoding/json" 5 "fmt" 6) 7 8const s = ` 9{ 10 "body":{ 11 "user_id":"3", 12 "expectations":[ 13 {"time":"1","input_number_1":"1","input_number_2":"2","input_number_3":"3","input_number_4":"4","input_number_5":"5","input_number_6":"6"}, 14 {"time":"2","input_number_1":"1","input_number_2":"2","input_number_3":"3","input_number_4":"4","input_number_5":"5","input_number_6":"6"} 15 ] 16 } 17} 18` 19 20type A構造体名 struct { 21 Body struct { 22 UserID string `json:"user_id"` 23 Expectations []map[string]string `json:"expectations"` // ※可変長です。UI的には行追加ボタンを押して何行でも入力できるイメージ 24 } `json:"body"` 25} 26 27func main() { 28 var v A構造体名 29 if err := json.Unmarshal([]byte(s), &v); err != nil { 30 panic(err) 31 } 32 fmt.Println(v.Body.Expectations) 33}

投稿2022/08/14 12:25

編集2022/08/14 12:32
nobonobo

総合スコア3367

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

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

whitehackerh

2022/08/14 15:07 編集

Array の部分も取得できました。 ありがとうございました。
nobonobo

2022/08/14 14:32

構造体の `Expectations` のところを `Expectations []map[string]string `json:"expectations"`` にするだけでOKのはずです。追記のサンプルコード上部のリンクは実際に動かしてみると正しくパースされます。 それ以外のエラーは何か別の要因で発生していそうです。 bodyの内容が期待したものになっているか確認してみましょう。
nobonobo

2022/08/15 07:10 編集

~~例えば、コメントにあるコードでエラー戻り値を無視していますが、これらもしっかりnilチェックしてnilでないならログに出すなどちゃんとハンドリングしておくと問題の原因を発見しやすくなりますので無視しないようにしましょう。~~ <-コメントのコードが消えたのであまり関係ないコメントになってしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問