无法从Python中漂亮地打印JSON

15

每当我尝试从 Python 打印 JSON 数据时,它会忽略换行符并打印字面字符串“\n”而不是换行符号。

我使用 Jinja2 生成 JSON 数据。这是我的代码:

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

它会打印出下面区块中的全部内容(字面上,包括引号和"\n"字符串):

"{\n    \"AWSTemplateFormatVersion\" : \"2010-09-09\",\n    \"Description\" : ... 
每当我尝试转储除了字典之外的任何内容时,我都会得到类似这样的结果。即使我尝试json.loads()然后再转储,我也得到垃圾数据。它只是删除所有换行符。出了什么问题?
4个回答

18

这是我用来漂亮地打印 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字符支持。


2
不,这样行不通。它没有解决“print”实际上打印“\n”而不是新行字符的问题。 - user1491250
2
如果使用JSON对象(或者在Python中使用字典)作为json.dumps()的输入,则它可以正常工作。如果您已经有一个表示为字符串的JSON对象,则不再需要使用json.dumps() - felixbr
如果我运行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))才能使其正常工作。 - user5359531

8

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 对象,而不是它的字符串表示:

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

我知道。我该如何使json.dumps返回换行符而不是文字,或者如何使print插值它们而不是打印文字? - user1491250
@user1491250:你还没有打印它。如果你已经打印了,那么换行符就会显示出来。你正在让Python shell显示返回值,并且使用字符串的repr进行操作。 - Tim Pietzcker
已更新。是的,我有。问题在于打印时打印了字面上的“\n”字符串而不是换行符。这就是为什么我在问的原因。 - user1491250
好的,谢谢。如果我将我的JSON转储到文件中并通过python -m json.tool运行它,它会按照我想要的方式输出。我正在尝试让我的Python脚本以同样的方式返回它。您知道我该如何复制那个输出吗? - user1491250
1
@user1491250:使用json.loads()将JSON编码的字符串转换为对象,然后使用print(或者更好的是pprint.pprint())打印出来。 - Tim Pietzcker

1
问题在于您输入到json.dumps的是一个字符串。请尝试以下操作:
print type(template.render(**self.config['templates'][name]))

如果您想进行缩进等操作,请尝试以下方法:
print json.dumps(json.loads(template.render(**self.config['templates'][name])), sort_keys=True, indent=4)

0
如果您的字符串已经是 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接