Q&A

line-bot-sdk-go で payload をバリデーションする

前提・実現したいこと

Go言語にて

json.RawMessage ([]byte型) で保持しているjsonデータが line-bot-sdk-go/v7 で提供されている linebot.SendingMessage interfaceを実装しているいずれかのstructと一致するかバリデーションしたい。

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

  • json.Unmarshal: template, flex typeを使いたいが 構造体にいくつものinterfaceがネストしている為unmarshalを自前で実装する必要がある。
	var tmp interface{}
	pay := json.RawMessage(`{ "type": "text", "text": "hoge"}`)
	if err := json.Unmarshal(pay, &tmp); err != nil {
		return err
	}
	var tmp interface{}
	pay := json.RawMessage(`{ "type": "flex", "altText": "this is a flex message","contents": {....}`)
	if err := json.Unmarshal(pay, &tmp); err != nil {
		return err
	}
  • 型アサーション: 上記と同じようにinterfaceが複数ある為, 都度switch文を書かなかればいけない。

いずれのやり方も interfaceが構造体にいくつも存在するので自前で実装するしかないでしょうか?

最終着地としてDBにjsonデーターをマスタとして保持し、サーバー内で正しいかを検証することです。

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

github.com/line/line-bot-sdk-go/v7/linebot
Go 1.17
  • 0
  • 3
  • 722
  • twitter facebook

普段Goを触らないのでよくわかりませんが、PythonのSDKであればWebhookのボディを検証するという機能がありますが、それはWebhook全体のJsonを検証しているのでDBに保存しているような形式のJsonを検証するというやり方は想定していない気がするので、ご自分で実装するのが早いと思います。

  • 0

Koki 様 コメントありがとうございます。

分かりづらくて申し訳ありません。

DB内には messageAPIの メッセージオブジェクト 型のJSONを保持します。

{
    "type": "text",
    "text": "Hello, I am Cony!!",
}

サーバーでDBから上記のようなJSONを取得してメッセージオブジェクトのいずれかの型に一致するかを検証したいです。

goのSDKでは SendingMessage interface だと思います。 https://pkg.go.dev/github.com/line/line-bot-sdk-go/linebot#SendingMessage

  • 0

最終着地としてDBにjsonデーターをマスタとして保持し、サーバー内で正しいかを検証することです。

なんのJSONを保持したいんですか? 色々試したことを書いていますが、結局何をしたいのかわからないのでもっと簡潔に書いてほしいです

  • 0
Are you sure? question.vm