[解決済み] 標準のjsonモジュールでfloatをフォーマットする
2022-05-15 13:48:21
質問
私は、標準の json モジュール を使って浮動小数点数のリストをシリアライズしています。しかし、私はこのような結果を得ています。
>>> import json
>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'
小数点以下2桁の浮動小数点数で表示させたい。出力はこのようになるはずです。
>>> json.dumps([23.67, 23.97, 23.87])
'[23.67, 23.97, 23.87]'
JSON Encoderクラスを独自に定義してみました。
class MyEncoder(json.JSONEncoder):
def encode(self, obj):
if isinstance(obj, float):
return format(obj, '.2f')
return json.JSONEncoder.encode(self, obj)
これは単独のfloatオブジェクトに対して動作します。
>>> json.dumps(23.67, cls=MyEncoder)
'23.67'
しかし、ネストされたオブジェクトに対しては失敗します。
>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'
外部依存が嫌なので、標準のjsonモジュールにこだわりたい。
どうすれば実現できますか?
どのように解決するのですか?
注意してください。 これは ではない は最近のどのバージョンのPythonでも動作します。
残念ながら、モンキーパッチによってこれを行う必要があると思います(私の意見では、これは標準ライブラリの設計上の欠陥を示すものです。
json
パッケージの設計上の欠陥を示すものだと私は考えています)。例えば、このようなコードです。
import json
from json import encoder
encoder.FLOAT_REPR = lambda o: format(o, '.2f')
print(json.dumps(23.67))
print(json.dumps([23.67, 23.97, 23.87]))
が出る。
23.67
[23.67, 23.97, 23.87]
を望むようにします。明らかに
FLOAT_REPR
をオーバーライドして、float のすべての表現を制御できるようにするアーキテクチャが必要です。
json
パッケージが設計された方法ではないのです:-)
関連
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] JSONでコメントを使用することはできますか?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] 数字を通貨文字列としてフォーマットする方法
-
[解決済み] Microsoft JSONの日付はどのようにフォーマットするのですか?
-
[解決済み] JSONファイルをprettyprintする方法は?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] ne__は__eq__の否定として実装されるべきか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PythonのJSONでDecimalオブジェクトをシリアライズする
-
[解決済み] pyvenv-3.4 は 0 ではない終了ステータス 1 を返しました。
-
[解決済み] Python で、クラスオブジェクトを dict にキャストするにはどうしたらいいですか?
-
[解決済み] asyncio.ensure_future vs. BaseEventLoop.create_task vs. simple coroutine?
-
[解決済み] virtualenvのどこにカスタムコードを置くか?
-
[解決済み] python: 2階層上のディレクトリを取得する
-
[解決済み] 2つのデータフレームをマージしようとすると、ValueErrorが発生します。
-
[解決済み] readonlyプロパティをmockでモックするには?
-
[解決済み] Python のモック patch.object を使って、他のメソッド内で呼び出されたメソッドの戻り値を変更する。
-
[解決済み] Pythonで文字列のb-プレフィックスを取り除くには?