7

Pythonでjsonを使用してオブジェクトをエンコードした結果の文字列をフォーマットする方法があるかどうかを知りたいです。たとえば、次の辞書があるとします。

{'a': 12.73874, 'b': 1.74872, 'c': 8.27495}

json エンコーディングの結果は次のとおりです。

{
    "c": 8.27495,
    "b": 1.74872,
    "a": 12.73874
}

私が望む結果は次のとおりです。

{
    "a": 12.74,
    "c": 8.28,
    "b": 1.75
}

要素の順序と各数値の小数点以下の桁数に注意してください。これを行う方法はありますか?

前もって感謝します!

4

6 に答える 6

14

2.6 以降を使用している場合は、次のように使用できます。

print json.dumps(jsonStr, sort_keys=True, indent=2, separators=(',', ': '))

http://docs.python.org/2/library/json.html

于 2013-03-07T19:59:21.153 に答える
3

意図されていない目的で JSON を使用しようとしているため、うまく機能しないのは当然のことです。Python のjsonモジュールのソース コードを独自の出力コードの出発点として使用することを検討できますが、おそらくゼロから始めるのが最も簡単です。このような出力関数を作成する作業はそれほど複雑ではありません。

于 2012-07-26T16:01:48.097 に答える
2

__repr__次のように、フロートをカスタムクラスに配置し、メソッドをオーバーライドすることで、フロートのシリアル化方法を変更できます。

import json

class CustomFloat(float):
    def __repr__(self):
        return "%.3g" % self

D = {'a': CustomFloat(12.73874),
     'b': CustomFloat(1.74872),
     'c': CustomFloat(8.27495)}

print json.dumps(D, indent=2)

これは印刷します:

{
  "a": 12.7, 
  "c": 8.27, 
  "b": 1.75
}

これは少なくともあなたの質問の半分を解決します。

于 2012-07-26T16:24:35.300 に答える
2

JSON と同様に Python の場合、dict 内の順序は意味を持ちません。よろしければ、辞書の代わりにリストを使用してください。

JSON 出力を並べ替えるだけの場合 (つまり、同等であってもより優先{1:0, 2:0}する場合)、項目が挿入された順序を記憶する を使用できます。{2:0, 1:0}collections.OrderedDict

于 2012-07-26T14:58:04.357 に答える
1
import json
from collections import OrderedDict

d = {'a': 12.73874, 'b': 1.74872, 'c': 8.27495}
L = sorted(d.items(), key=lambda x: x[1], reverse=True) # sort by float value
print(json.dumps(OrderedDict((k, round(v, 2)) for k, v in L), indent=4))

出力

{
    "a": 12.74, 
    "c": 8.27, 
    "b": 1.75
}

yaml代わりに、を使用できます。

于 2012-07-26T17:02:48.473 に答える
1

またはで試しsort_keys=Trueてください。例えば、json.dumpsjson.JSONEncoder.__init__

>>> import json
>>> d = {'a': 'Apple', 'b': Banana, 'c': 'Pepsi'}
>>> print json.dumps(d)
{"a": "Apple", "c": "Pepsi", "b": "Banana}
>>> print json.dumps(d, sort_keys=True)
{"a": "Apple", "b": "Banana, "c": "Pepsi"}
于 2012-07-26T15:39:29.763 に答える