使用python进行Json字符串格式化

时间:2012-07-26 14:51:56

标签: python json string format

我想知道是否有任何方法可以使用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
}

注意元素的顺序和每个数字的小数位。有没有办法做到这一点?

提前致谢!

6 个答案:

答案 0 :(得分:11)

如果您使用的是2.6+,则可以使用:

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

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

答案 1 :(得分:2)

对于Python和JSON,dict中的顺序没有任何意义。如果你介意的话,请使用列表而不是dicts。

如果您只想订购JSON输出(即{1:0, 2:0}优于{2:0, 1:0},即使它们是等效的),您也可以使用collections.OrderedDict来记住订单这些物品已被插入。

答案 2 :(得分:2)

你正试图将JSON用于它不适合的东西,所以毫不奇怪它不能正常工作。您可以考虑使用source code of Python's json module作为您自己的输出代码的起点,尽管从头开始可能最简单 - 编写这样的输出函数并不是那么复杂。

答案 3 :(得分: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
}

这至少解决了你问题的一半。

答案 4 :(得分:1)

使用sort_keys=Truejson.dumps尝试json.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"}

答案 5 :(得分: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
}

作为替代方案,您可以使用yamlexample