2012-10-17 113 views
471

我有一個JSON文件,該文件是我想prettyprint--什麼是python中要做到這一點最簡單的方法一塌糊塗?我知道PrettyPrint需要一個「對象」,我認爲它可以是一個文件,但我不知道如何傳遞文件 - 只是使用文件名不起作用。如何打印JSON文件?

+6

嘗試解析JSON使用'json.loads()'和漂亮的打印結果字典。或者直接跳到Python的[Pretty print]部分['json'的文檔](http://docs.python.org/library/json.html)。 – Blender

+10

http://stackoverflow.com/questions/352098/how-to-pretty-print-json-script –

+0

@Blender如果你發佈一個答案我會給你信貸......這可能會因爲重複而關閉,因爲解決方案是一樣的,但問題是不同的,所以也許不是。 – Colleen

回答

781

json模塊已經實現了一些基本的漂亮印花與indent參數:

>>> import json 
>>> 
>>> your_json = '["foo", {"bar":["baz", null, 1.0, 2]}]' 
>>> parsed = json.loads(your_json) 
>>> print json.dumps(parsed, indent=4, sort_keys=True) 
[ 
    "foo", 
    { 
     "bar": [ 
      "baz", 
      null, 
      1.0, 
      2 
     ] 
    } 
] 

解析文件,使用json.load

with open('filename.txt', 'r') as handle: 
    parsed = json.load(handle) 
+56

對於簡單的漂亮打印,這也可以在沒有明確解析的情況下運行:''print json.dumps(your_json_string,indent = 4)'' – Peterino

+1

indent是做什麼的? – timbram

+4

@timbram:這是要縮進的空格的數量。 – Blender

148

你可以在命令行上做到這一點:

cat some.json | python -m json.tool 

(如已中號在問題的評論中提到)。

實際上python並不是我最喜歡的工具,就json在命令行上的處理而言。對於簡單漂亮的打印是好的,但如果你想操縱JSON,它可能會變得過於複雜。你很快就需要編寫一個單獨的腳本文件,你最終可以得到其鍵是「某個鍵」(python unicode)的地圖,這使得選擇字段變得更加困難,並且不會真的朝着漂亮的方向前進 - 印刷。

我用jq。以上可以通過以下方式完成:

cat some.json | jq '' 

您將獲得顏色作爲獎勵(並且方式更容易擴展)。

+1

JQ很棒,但是有一個最大限制,所以它對大文件無用。 (即處理一個1.15MB的文件) https://github.com/stedolan/jq/issues/1041 –

+2

是的,男人,當然,如果你正在寫超過10K行代碼的jq過濾器我想你'重新嘗試像騎自行車去火星那樣的事情。 –

+1

lol:D @ gismo-ranas通過管道傳輸到一個文件的json.tool版本對於大文件非常有效;而且速度很快。我喜歡JQ,但格式化的東西超出了一個小的有效載荷(你可以在大多數文本編輯器中完成)超出了它的範圍:) 隨機添加:http://www.json-generator.com/是一個簡潔的工具來製作測試數據 –

30

Pygmentize + Python的json.tool =漂亮與語法高亮

Pygmentize是一個殺手工具打印。 See this.

我結合蟒蛇json.tool與pygmentize

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json 

見上面pygmentize安裝說明的鏈接。

這樣做的演示是在下面的圖片:

demo

+1

在你的例子中'-g'實際上並不工作;)由於輸入來自stdin,所以pygmentize無法做出很好的猜測。你需要明確地指定lexer:'echo'{「foo」:「bar」}'| python -m json.tool | pygmentize -l json' –

+0

@DenisTheMenace它曾經在2015年工作時創建了這個示例圖像。現在我的系統似乎也沒有工作。 –

24

使用此功能,不出汗不必記住,如果你的JSON是strdict再次 - 只要看看美麗的打印:

import json 

def pp_json(json_thing, sort=True, indents=4): 
    if type(json_thing) is str: 
     print(json.dumps(json.loads(json_thing), sort_keys=sort, indent=indents)) 
    else: 
     print(json.dumps(json_thing, sort_keys=sort, indent=indents)) 
    return None 

pp_json(your_json_string_or_dict) 
7

爲了能夠相當從命令行打印,並能有超過縮進控制等,你可以建立一個類似這樣的別名:

alias jsonpp="python -c 'import sys, json; print json.dumps(json.load(sys.stdin), sort_keys=True, indent=2)'" 

然後使用別名下列方式之一:

cat myfile.json | jsonpp 
jsonpp < myfile.json 
6

你可以使用pprint

如何讀取JSON數據文件並打印出來。

import json 
import pprint 

with open('filename.txt', 'r') as f: 
    json_data = json.load(f.read()) 

pprint.pprint(json_data) 
2

這裏的漂亮打印JSON在Python中的一個不錯的方式控制檯的一個簡單的例子,而不需要JSON到您的計算機上的本地文件:

+0

我在Python 3中得到以下錯誤信息:「TypeError:JSON對象必須是str,而不是'bytes'」 – MrT