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 用于它不打算用于的东西,所以它不能很好地工作也就不足为奇了。您可以考虑使用Pythonjson模块的源代码作为您自己的输出代码的起点,尽管从头开始可能最容易——编写这样的输出函数并不是那么复杂的任务。

于 2012-07-26T16:01:48.097 回答
2

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

如果您只想订购 JSON 输出(即,更喜欢{1:0, 2:0}{2:0, 1:0}即使它们是等效的),您可以使用collections.OrderedDictwhich 将记住插入项目的顺序。

于 2012-07-26T14:58:04.357 回答
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 回答
1

尝试sort_keys=True使用json.dumpsor 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"}
于 2012-07-26T15:39:29.763 回答
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

于 2012-07-26T17:02:48.473 回答