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

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

Ответ 1

Модуль 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)

Ответ 2

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

python3 -m json.tool < some.json

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

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

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

jq . some.json

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

Приложение: В комментариях есть некоторая путаница относительно использования jq для обработки больших файлов JSON, с одной стороны, и наличия очень большой jq-программы, с другой. Для красивой печати файла, состоящего из одного большого объекта JSON, практическим ограничением является ОЗУ. Для красивой печати файла объемом 2 ГБ, состоящего из одного массива реальных данных, "максимальный размер резидентного набора", необходимый для красивой печати, составлял 5 ГБ (с использованием jq 1.5 или 1.6). Также обратите внимание, что jq можно использовать из питона после pip install jq.

Ответ 3

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

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

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

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

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

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

demo

Ответ 4

Вы можете использовать встроенный модуль 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)

Ответ 5

Используйте эту функцию и не помните, если ваш 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)

Ответ 6

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

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

Ответ 7

Используйте pprint: https://docs.python.org/3.6/library/pprint.html

import pprint
pprint.pprint(json)

print() по сравнению с pprint.pprint()

print(json)
{'feed': {'title': 'W3Schools Home Page', 'title_detail': {'type': 'text/plain', 'language': None, 'base': '', 'value': 'W3Schools Home Page'}, 'links': [{'rel': 'alternate', 'type': 'text/html', 'href': 'https://www.w3schools.com'}], 'link': 'https://www.w3schools.com', 'subtitle': 'Free web building tutorials', 'subtitle_detail': {'type': 'text/html', 'language': None, 'base': '', 'value': 'Free web building tutorials'}}, 'entries': [], 'bozo': 0, 'encoding': 'utf-8', 'version': 'rss20', 'namespaces': {}}

pprint.pprint(json)
{'bozo': 0,
 'encoding': 'utf-8',
 'entries': [],
 'feed': {'link': 'https://www.w3schools.com',
          'links': [{'href': 'https://www.w3schools.com',
                     'rel': 'alternate',
                     'type': 'text/html'}],
          'subtitle': 'Free web building tutorials',
          'subtitle_detail': {'base': '',
                              'language': None,
                              'type': 'text/html',
                              'value': 'Free web building tutorials'},
          'title': 'W3Schools Home Page',
          'title_detail': {'base': '',
                           'language': None,
                           'type': 'text/plain',
                           'value': 'W3Schools Home Page'}},
 'namespaces': {},
 'version': 'rss20'}

Ответ 8

Вот простой пример красивой печати 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))

Ответ 9

Однажды я написал функцию prettyjson() красивый результат. Вы можете получить реализацию из этого репо.

Главной особенностью этой функции является то, что она пытается сохранять дикт и перечислять элементы в одну строку, пока maxlinelength будет достигнута определенная maxlinelength. Это дает меньше строк JSON, вывод выглядит более компактным и более легким для чтения.

Вы можете создать такой вывод, например:

{
  "grid": {"port": "COM5"},
  "policy": {
    "movingaverage": 5,
    "hysteresis": 5,
    "fan1": {
      "name": "CPU",
      "signal": "cpu",
      "mode": "auto",
      "speed": 100,
      "curve": [[0, 75], [50, 75], [75, 100]]
    }
}

Ответ 10

Я думаю, что лучше разбирать json раньше, чтобы избежать ошибок:

def format_response(response):
    try:
        parsed = json.loads(response.text)
    except JSONDecodeError:
        return response.text
    return json.dumps(parsed, ensure_ascii=True, indent=4)

Ответ 11

Вы можете попробовать pprintjson.


Установка

$ pip3 install pprintjson

Usage

UsageДовольно распечатать JSON из файла, используя CLI pprintjson.

$ pprintjson "./path/to/file.json"

Довольно распечатать JSON из стандартного ввода, используя CLI pprintjson.

$ echo '{ "a": 1, "b": "string", "c": true }' | pprintjson

Довольно распечатать JSON из строки, используя CLI pprintjson.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }'

Довольно распечатать JSON из строки с отступом 1.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }' -i 1

Довольно распечатать JSON из строки и сохранить вывод в файл output.json.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }' -o ./output.json

Выход

enter image description here

Ответ 12

def saveJson(date,fileToSave):
    with open(fileToSave, 'w+') as fileToSave:
        json.dump(date, fileToSave, ensure_ascii=True, indent=4)

Это работает, чтобы отобразить или сохранить его в файл.