【问题标题】:Json string formatting with python使用python格式化Json字符串
【发布时间】:2012-07-25 04:48:20
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • 你使用的是什么 JSON ecnode? Python 附带的那个,或者simplejson,还是另一个?
  • 我认为 JSON 的重点是能够准确地还原您提供给它的对象。在这种情况下,如果在小数点后截断,则无法再从 JSON 中恢复字典(尽管排序是另一回事)
  • 我正在使用 python 附带的 json。我认为这里的问题不在于 json 本身,而在于我使用 json 的目的。我使用它不是为了能够准确地恢复我编码的对象(恢复对象在我的应用程序的上下文中甚至不重要),而是作为一种以人类可读的方式轻松记录它们的方式。这就是为什么小数位和顺序很重要。但我想如果我自己打印文件而不是使用 json 会更简单:)
  • 注意:"%.2f" % vround(v, 2) 都为 v = 8.27495 生成 8.27,而不是 8.28

标签: python json string format


【解决方案1】:

如果你使用的是 2.6+,你可以这样做:

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

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

【讨论】:

    【解决方案2】:
    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

    【讨论】:

      【解决方案3】:

      您可以通过将浮点数放入自定义类并覆盖__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】:

        您正在尝试将 JSON 用于不适合的用途,因此它无法正常工作也就不足为奇了。您可以考虑使用source code of Python's json module 作为您自己的输出代码的起点,尽管从头开始可能最容易——编写这样一个输出函数并不是那么复杂的任务。

        【讨论】:

        • 是的,你是对的。这就是我最终要做的事情,因为正如你所说,这根本不是一项艰巨的任务。
        • 更好的选择可能是使用内置的 ast 模块:docs.python.org/2/library/ast.html
        【解决方案5】:

        试试sort_keys=Truejson.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"}
        

        【讨论】:

        • 我已经试过了。问题是,我不需要按字典顺序排列字典的内容,我需要按我指定的顺序排列它们。就我而言,我需要打印的是 X、Y、Z、方位角、仰角和滚动(字典的内容),我希望它按此顺序打印。如果我使用 sort_keys,我的顺序是:方位角、仰角、滚动、X、Y、Z
        【解决方案6】:

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

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

        【讨论】:

        • 该错误似乎已在 2010 年 12 月修复:hg.python.org/cpython/rev/64a97c4ebadc
        • issue6105 为早期版本提供了一个解决方法:json.encoder.c_make_encoder = None.dumps() 之前。
        猜你喜欢
        • 2017-01-10
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 2019-11-28
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多