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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

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

Q&A

解決済

3回答

964閲覧

Flaskで辞書型の要素の順番が維持されない

t_makino

総合スコア22

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

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

0グッド

0クリップ

投稿2023/06/08 04:50

実現したいこと

Flaskの辞書型の要素の順番を維持したい。

実行環境 

Python: 3.11.1
Flask:2.3.2

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

Flask:app.py

1@app.get('/test') 2def test(): 3 return { 4 'title': 'タイトル', 5 'content': 'コンテント' 6}

上のコードを作成し、そのURLをたたくと

{ "content": "コンテンツ", "title": "タイトル222" }

上のような戻り値が返ってきます。しかしながら、ソースコード上は戻り値を
title,contentの順番で並べているにも関わらず、APIをたたいた時のレスポンスでは
content,titleの順番になってしまいます。

試したこと

下記のようにOrderedDictを使用したものも作成してみましたが、通常の辞書を使用したものと同様に順番がくるっていました。

Flask:app.py

1from collections import OrderedDict 2 3@app.get('/test') 4def test(): 5 dict = OrderedDict() 6 dict['title'] = 'タイトル222' 7 dict['content'] = 'コンテンツ' 8 return dict

以上、解決方法がお分かりになるかた、情報をご提供いただけると助かります。

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

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

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

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

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

guest

回答3

0

ベストアンサー

https://flask.palletsprojects.com/en/2.3.x/api/#flask.json.provider.DefaultJSONProvider.sort_keys
DefaultJSONProviderでsort_keysがTrueにしてあるからですね。データとして等価なので、順番を気にする方がおかしくて、これで問題になることはないです。(問題が起きるならどこかでJSONの仕様が無視されている)


https://flask.palletsprojects.com/en/2.3.x/changes/#version-2-3-0

The JSON_AS_ASCII, JSON_SORT_KEYS, JSONIFY_MIMETYPE, and JSONIFY_PRETTYPRINT_REGULAR config keys are removed.

https://flask.palletsprojects.com/en/2.3.x/config/?highlight=json_sort_keys#MAX_COOKIE_SIZE

Changed in version 2.3: JSON_AS_ASCII, JSON_SORT_KEYS, JSONIFY_MIMETYPE, and JSONIFY_PRETTYPRINT_REGULAR were removed. The default app.json provider has equivalent attributes instead.

なので Flask2.3以降だとappの初期化時に

app.json.sort_keys = False

を入れるといいのかなと思います。

https://github.com/pallets/flask/blob/2.3.2/src/flask/json/provider.py#L151

投稿2023/06/08 06:00

quickquip

総合スコア11029

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

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

t_makino

2023/06/08 06:06

ありがとうございます! pythonを始めたばかりで、Flaskの仕様まで目が届いておりませんでした。
guest

0

そもそも論として、JSONのオブジェクトは順番を持たないものです。

An object is an unordered set of name/value pairs. (json.orgより、強調は引用者)

Pythonの中では順番に意味があるかもしれませんが、外部とやり取りするJSONレベルで順番を期待することそのものが妥当ではありません。

投稿2023/06/08 05:02

maisumakun

総合スコア145121

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

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

0

json.dumpsを使って、自己解決しました。

投稿2023/06/08 05:54

t_makino

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問