2013-05-01 150 views
12

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

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

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

它打印出在下面的块的一切(字面意思 - 即使引号和 “\ n” 的字符串):

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

(截)

我得到的东西每当我尝试转储除字典之外的任何内容时都会这样。即使我尝试json.loads()然后再次转储它,我得到垃圾。它只是去除所有换行符。

怎么回事?

回答

17

这是我用漂亮打印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 2013-05-01 14:14:29

+2

如果使用JSON-_object_(或者python中的dict)作为'json.dumps()'的输入,它会起作用。如果你已经有了一个以字符串表示的JSON对象,那么你不再需要'json.dumps()'。如果我运行'dat = json.loads(payload.content)',其中'type(payload)'是 ''和'type(dat)'是 '', – felixbr 2013-05-01 14:28:54

+0

' 'json.dumps(dat,indent = 4)'仍然在控制台输出中显示'\ n'字符,'json.dumps(payload.content,indent = 4)'显示一大堆'\'字符,缩进。我在这里错过了什么吗?编辑:是的,看起来像我必须做'打印(json.dumps(dat,indent = 4))'让它在交互式控制台会话中工作。 – user5359531 2017-04-27 01:44:21

7

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 
+0

我知道。我如何使json.dumps返回新的行字符而不是文字,或者如何使打印内插而不是打印文字? – user1491250 2013-05-01 13:01:01

+0

@ user1491250:您*尚未*印刷。如果有的话,换行符会显示出来。你正在让Python shell显示返回值,这是通过使用字符串的'repr'完成的。 – 2013-05-01 13:02:17

+0

已更新。是的,我有。问题是打印它会打印文字“\ n”字符串而不是换行。这就是为什么我问。 – user1491250 2013-05-01 13:03:56

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) 
0

的问题是,您输入json.dumpsstring打印。请尝试以下操作:

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

它,你这样做是为了缩进等..请尝试以下操作:

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