2013-05-01 193 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)