我想知道是否有任何方法可以使用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
}
注意元素的顺序和每个数字的小数位。有没有办法做到这一点?
提前致谢!
答案 0 :(得分:11)
如果您使用的是2.6+,则可以使用:
print json.dumps(jsonStr, sort_keys=True, indent=2, separators=(',', ': '))
答案 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=True
或json.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
}
作为替代方案,您可以使用yaml
,example。