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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

3回答

2475閲覧

【Python】JSONの真偽値について

ninba

総合スコア1

JSON

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

1クリップ

投稿2020/08/15 13:33

編集2020/08/17 08:59

#やりたいこと
JSONで真偽値を扱う

#コード
AWSのlambdaとSlackのAPIを使ってSlack上でBotを動かしています。基本的には正常に動作するのですが、真偽値を返す必要がある機能だけ正しく機能しません。具体的には以下のコード"unfurl_links": True,"unfurl_media": True(リンクや画像を展開させるか否かの設定です)についてですが、これらのコードが無い場合と同じ挙動をします(bot自体は動くものの、リンクやファイルの展開がされない)。おそらく、Jsonの送り方に何か誤りがあって思い通りいかないと思われるので、お力添えいただければ幸いです。

def post_message_to_slack_channel(message: str, channel: str, channelId: str, user: str, image: str): # Slackのchat.postMessage APIを利用して投稿する # ヘッダーにはコンテンツタイプとボット認証トークンを付与する url = "https://slack.com/api/chat.postMessage" headers = { "Content-Type": "application/json; charset=UTF-8", "Authorization": "Bearer {0}".format(os.environ["SLACK_BOT_USER_ACCESS_TOKEN"]) } data = { "token": os.environ["SLACK_APP_AUTH_TOKEN"], "channel": channel, "text": message, "unfurl_links": True, "unfurl_media": True, "username": user, "icon_url": image, "attachments": [ { "fallback": "Plain-text summary of the attachment.", "color": "#2eb886", "footer": "ハンク君 | リプライはリンクをクリック→ " + "<#" + channelId + "|" + channel + ">", "footer_icon": "https://3.bp.blogspot.com/-jtvaRX9n8OU/VaMOHGaVeRI/AAAAAAAAviQ/D9omX3FtbPw/s800/boy_05.png" } ] } req = urllib.request.Request(url, data=json.dumps(data).encode('utf-8'), method="POST", headers=headers) urllib.request.urlopen(req) return "OK"

追記
"unfurl_links": True,"unfurl_media": Trueはこちらから送信しているデータです。
json.dumps(data).encode('utf-8')をログに出力させると、

{ "token": "mkGZRssFyF4k6U0DcczP4p1O", "channel": "important_timeline", "text": "<https://qiita.com/kamata1729/items/8d88ea10dd3bb61fa6cc>", "unfurl_links": true, "unfurl_media": true, "username": "aaa", "icon_url": "https://secure.gravatar.com/avatar/6d5e0dbbc3866bd59540ee26b5fc1969.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0014-512.png", "attachments": [ { "fallback": "Plain-text summary of the attachment.", "color": "#2eb886", "footer": "\u30cf\u30f3\u30af\u541b \uff5c \u30ea\u30d7\u30e9\u30a4\u306f\u30ea\u30f3\u30af\u3092\u30af\u30ea\u30c3\u30af\u2192 <#C0175MJ0D3Q|important_timeline>", "footer_icon": "https://3.bp.blogspot.com/-jtvaRX9n8OU/VaMOHGaVeRI/AAAAAAAAviQ/D9omX3FtbPw/s800/boy_05.png" } ] }

のようになりました。
json関係でのミスではないかと思うに至った理由は、私がpythonの通信周りについてほとんど知識がない事、真偽値以外のパラメータは正常に機能する事が事実としてあるので、真偽値と文字列の違いがjsonを送る上で何かに引っかかっているのではと素人ながら考えたからです。
また、"unfurl_links": true,"unfurl_media": trueとした時はtrueという文字列が認められないという旨のエラー("や'で囲まれていない文字列として扱われてしまう)が、"unfurl_links": 'true',"unfurl_media": 'true'とした時は、質問の本題と同じくbotは動くもののリンクやファイルの展開がされないという状態になります。

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

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

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

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

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

miyabi_takatsuk

2020/08/15 13:41

"unfurl_links": True, は、 Python側から送信しているデータでしょうか?
miyabi_takatsuk

2020/08/15 13:46

json.dumps(data).encode()の内容を一度printなどで確認した方がいいかと。 おそらく、論理値が、文字列に置き換わってしまってるとか、そんな不都合な気がします。
quickquip

2020/08/17 09:37 編集

> おそらく、Jsonの送り方に何か誤りがあって思い通りいかないと思われるので そう思った理由が欲しいです。 https://teratail.com/help/question-tips#questionTips3-4 で「結果(実際に起きたこと)を書きましょう」、「自分で解釈・要約しようとしてはいけません」と書いてあるとおりなのですが。
quickquip

2020/08/15 15:32 編集

JSONを見ておかしいと思ったわけではないのですね。 > 正しく機能しません がなんなのか他人には一切伝わりません。
ninba

2020/08/15 16:33

SlackAPIを用いてBotを動かしている旨は記載しています。
quickquip

2020/08/15 16:47 編集

「結果(実際に起きたこと)を書きましょう」と書いたのですがそうなってないですよね、ということを言っています。 エラーになるんですか? 「パラメータがない時と動作が変わらない」ですか? あるいは「両方を真に設定したら両方が有効になると思ったのにそうならない」や「unfurl_linksの方が動かない」ですか?
ninba

2020/08/16 13:49

言葉足らずでした、申し訳ございません。↑のコードでは「パラメータがない時と動作が変わらない」という結果が得られます。これは、`"unfurl_links": True,"unfurl_media": True`の両方について当てはまります。
quickquip

2020/08/16 15:41 編集

確認が取れないので回答じゃないのですが Pythonコード "unfurl_links": True, "unfurl_media": False, JSONデータ "unfurl_links": true, "unfurl_media": false, のパターンなどは試していますか? qiitaのURLを指定しているのですから、パラメータはこうするべきなのではと思ったので。 どちらかだけを設定したパターンも試してみているなら、そのあたりも含めて質問に書き加えるのがよいと思います。(この欄に情報を載せるべきではないです)
ninba

2020/08/17 08:52

申し訳ございません。おそらく今の状況がquiqui様の提案そのものだと思うのですが、いかがですか?
quickquip

2020/08/17 09:39 編集

2020/08/15 23:41 のコメント、コピーミスで 「結果(実際に起きたこと)を書きましょう」、「自分で解釈・要約しようと書いてあるとおりなのですが。 となっていましたが 「結果(実際に起きたこと)を書きましょう」、「自分で解釈・要約しようとしてはいけません」と書いてあるとおりなのですが。 でした。意図と逆になっていました。すみません。(編集しました)
quickquip

2020/08/17 09:44 編集

そういうこともあって心苦しいのですが、 > trueという文字列が認められないという旨のエラー("や'で囲まれていない文字列として扱われてしまう) の部分に解釈・要約が入っています。 これだと、Pythonのエラーなのか、API呼び出しでエラーなのか区別が付きません。 最低限、エラーメッセージがそのまま書かれてさえいれば、知識がある人が見れば区別が付きます。 こういうところに解釈が入ると状況が掴みづらくなります。 おそらく、Pythonコード上で "unfurl_links": true, と書いたという話だとは思っているのですが。
guest

回答3

0

的を外しているかもしれませんが、 JSON の真偽値は True ではなく true ではないでしょうか? 大文字の使用は認められておりません。

JSONについて調べてみた - Qiita - chihiroさん

RFC 8259規格の定義

投稿2020/08/16 08:17

編集2020/08/16 09:30
PINTO

総合スコア351

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

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

0

実際試していない状況での回答になりますが。

https://api.slack.com/reference/messaging/link-unfurling

unfurl_links applies to text based content, unfurl_media applies to media based content. These flags are mutually exclusive, the unfurl_links flag has no effect on media content.

とあるので、両方を真にしたら unfurl_links は無視されるのではないでしょうか?

qiitaのURLに unfurl_media フラグが効くとは思えないので、コードが無い場合と同じ挙動をするのは正しいのでは? と感じます。


それとも media content でないときは、unfurl_media が真でも unfurl_links は効くのでしょうか?

効く可能性もありますが

https://api.slack.com/reference/messaging/link-unfurling#examples

には一方しか指定していない例だけがあるので、一方だけにするのがいいのではと思います。

私なら、(Pythonコードで)

"unfurl_links": True, "unfurl_media": False,
"unfurl_links": False, "unfurl_media": True,
"unfurl_links": True,
"unfurl_media": True,

の4通りを試してみるでしょう。

投稿2020/08/17 09:51

編集2020/08/17 09:56
quickquip

総合スコア11038

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

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

0

すいません、既に対応済みの内容でした。
下記内容は無視してください。

```python import json payload = json.dumps(params) ``` - ~~~ [Send Json (contains boolean/numbers) data in python GET(Method) requests](https://stackoverflow.com/questions/46303885/send-json-contains-boolean-numbers-data-in-python-getmethod-requests/46307282)~~~

投稿2020/08/17 01:28

編集2020/08/17 02:36
nekoniki

総合スコア2409

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問