Как распечатать файл JSON?

723

У меня есть файл JSON, который является беспорядком, который я хочу использовать для печати. ​​Какой самый простой способ сделать это в python? Я знаю, что PrettyPrint принимает "объект", который, я думаю, может быть файлом, но я не знаю, как передать файл... просто использование имени файла не работает.

  • 6
    Попробуйте проанализировать JSON с помощью json.loads() и распечатать полученный словарь. Или просто перейдите в раздел печати Pretty документации Python для json .
  • 11
    stackoverflow.com/questions/352098/...
Показать ещё 4 комментария
Теги:
pretty-print

7 ответов

1029
Лучший ответ

Модуль 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)
  • 88
    Для простой симпатичной печати это также работает без явного анализа: print json.dumps(your_json_string, indent=4)
  • 1
    что делает отступ?
Показать ещё 6 комментариев
232

Вы можете сделать это в командной строке:

python3 -m json.tool < some.json

(как уже упоминалось в комментариях к вопросу, спасибо @Kai Petzke за предложение python3).

На самом деле python - не мой любимый инструмент в отношении обработки json в командной строке. Для простой красивой печати это нормально, но если вы хотите манипулировать json, это может стать слишком сложным. Вскоре вам нужно будет написать отдельный скрипт файл, вы можете получить карты, ключи которых у вас "some-key" (юникод python), что делает выбор полей более сложным и на самом деле не идет в направлении довольно Печатание.

Я использую JQ. Выше может быть сделано с:

jq '' < some.json

и вы получаете цвета в качестве бонуса (и это значительно расширяет возможности).

  • 2
    JQ хорош, но есть максимальный предел, поэтому он бесполезен для больших файлов. (то есть взрывает обработку файла размером 1,15 Мб) github.com/stedolan/jq/issues/1041
  • 3
    да, мужик, определенно, если вы пишете JQ-фильтры с более чем 10K строками кода, я думаю, вы пытаетесь что-то наподобие поездки на Марс с велосипедом.
Показать ещё 6 комментариев
43

Pygmentize + Python json.tool = Красивая печать с подсветкой синтаксиса

Пигментирование является убийственным инструментом. Видеть это.

Я объединяю python json.tool с пигментированием

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

Смотрите ссылку выше для пигментирования инструкции по установке.

Демонстрация этого на изображении ниже:

Изображение 2516

  • 1
    В вашем примере -g самом деле не работает;) Поскольку входные данные поступают из stdin, pygmentize не может сделать правильное предположение. Вам нужно явно указать лексер: echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
  • 1
    @DenisTheMenace Он работал в 2015 году, когда я создал этот пример изображения. Похоже, что теперь он не работает на моей системе.
30

Используйте эту функцию и не помните, если ваш JSON снова является str или dict - просто посмотрите на красивую печать:

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

Вы можете использовать встроенный pprint.

Как вы можете прочитать файл с данными JSON и распечатать его.

import json
import pprint

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

pprint.pprint(json_data)
  • 0
    Проблема в том, что pprint будет взаимозаменяемо использовать одинарные и двойные кавычки, но json требует только двойные кавычки, поэтому ваш напечатанный json больше не может анализироваться как действительный json.
  • 0
    Да, но это только для вывода файла JSON. Не брать вывод и снова записывать его в файл.
8

Чтобы иметь возможность печатать из командной строки и иметь возможность контролировать отступ и т.д., вы можете настроить псевдоним, подобный этому:

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
4

Вот простой пример красивой печати JSON на консоль хорошим способом в Python, не требуя, чтобы JSON был на вашем компьютере в виде локального файла:

import pprint
import json 
from urllib.request import urlopen # (Only used to get this example)

# Getting a JSON example for this example 
r = urlopen("https://mdn.github.io/fetch-examples/fetch-json/products.json")
text = r.read() 

# To print it
pprint.pprint(json.loads(text))
  • 0
    Я получаю следующее сообщение об ошибке в Python 3: «TypeError: объект JSON должен быть str, а не« байтами »»

Ещё вопросы

Сообщество Overcoder
Наверх
Меню