【问题标题】:Can't pretty print json from python不能从python漂亮地打印json
【发布时间】:2013-05-01 12:59:02
【问题描述】:

每当我尝试从 python 打印出 json 时,它都会忽略换行符并打印文字字符串“\n”而不是换行符。

我正在使用 jinja2 生成 json。这是我的代码:

print json.dumps(template.render(**self.config['templates'][name]))

它打印出下面块中的所有内容(字面意思 - 甚至包括引号和“\n”字符串):

"{\n    \"AWSTemplateFormatVersion\" : \"2010-09-09\",\n    \"Description\" : ... 

(截断)

每当我尝试转储除 dict 以外的任何内容时,都会得到类似的结果。即使我尝试 json.loads() 然后再次转储它,我也会得到垃圾。它只是去掉所有换行符。

怎么了?

【问题讨论】:

    标签: python json


    【解决方案1】:

    这是我用于漂亮打印 json 对象的方法:

    def get_pretty_print(json_object):
        return json.dumps(json_object, sort_keys=True, indent=4, separators=(',', ': '))
    
    print get_pretty_print(my_json_obj)
    

    json.dumps() 也接受编码参数,如果您需要非 ascii 支持。

    【讨论】:

    • 不,这不起作用。它没有解决“打印”实际上打印“\n”而不是换行符这一事实的问题。
    • 如果使用 JSON-object(或者更确切地说是 python 中的 dict)作为json.dumps() 的输入,它确实有效。如果您已经有一个表示为字符串的 JSON 对象,则不再需要 json.dumps()
    • 如果我运行dat = json.loads(payload.content),其中type(payload)<class 'requests.models.Response'>type(dat)<type 'dict'>json.dumps(dat, indent=4) 仍然在控制台输出中显示\n 字符,json.dumps(payload.content, indent=4) 显示大量的 ` \\ ` 字符并且没​​有缩进。我在这里错过了什么吗?编辑:是的,看起来我必须做print(json.dumps(dat, indent=4)) 才能让它在交互式控制台会话中工作。
    【解决方案2】:

    json.dumps() 返回一个 JSON 编码的字符串。 JSON 标准要求将换行符编码为\\n,然后打印为\n

    >>> s="""hello
    ... there"""
    >>> s
    'hello\nthere'
    >>> json.dumps(s)
    '"hello\\nthere"'
    >>> print(json.dumps(s))
    "hello\nthere"
    

    如果你想保留一个有效的 JSON 字符串,你可以做的改变不多。如果你想打印它,正确的方法是打印 JSON object,而不是它的字符串表示:

    >>> print(s)
    hello
    there
    >>> print(json.loads(json.dumps(s)))  # pointless; just for demonstration...
    hello
    there
    

    【讨论】:

    • 我知道。如何让 json.dumps 返回换行符而不是文字,或者如何让 print 插入它们而不是打印文字?
    • @user1491250:您还没有打印它。如果你有,换行符将是可见的。您让 Python shell 显示返回值,这是使用字符串的 repr 完成的。
    • 已更新。是的,我有。问题是打印它会打印文字“\ n”字符串而不是新行。这就是我问的原因。
    • 好的,谢谢。如果我将我的 json 转储到一个文件并通过python -m json.tool 运行它,它会按我的意愿出现。我试图让我的 python 脚本像那样返回它。你知道我如何复制那个输出吗?
    • @user1491250: json.loads() 将 JSON 编码的字符串转换为对象,然后将 print(或者,也许更好,pprint.pprint())那个。
    【解决方案3】:

    问题是您对json.dumps 的输入是string。请尝试以下操作:

    print type(template.render(**self.config['templates'][name]))
    

    如果您这样做是为了缩进等...请尝试以下操作:

    print json.dumps(json.loads(template.render(**self.config['templates'][name])), sort_keys=True, indent=4)
    

    【讨论】:

      【解决方案4】:

      如果您的字符串已经是 JSON,则使用漂亮的打印它

      def pp_json(json_string):
      # converts json to dict then back to string... ridiculous but not pointless 
          print(json.dumps(json.loads(json_string), sort_keys=True, indent=4)) 
          return
      
      pp_json(your_json_string)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-12
        • 1970-01-01
        • 2015-07-03
        • 2015-08-26
        相关资源
        最近更新 更多