Python: Indenter un contenu JSON

Voici un petit script Python qui me permet d'afficher à l'écran n'importe quel contenu JSON correctement indenté (afin de faciliter la lisibilité).

linkprettyJson.py

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import json, sys
from pprint import pprint

if not sys.stdin.isatty():
    JSON = json.loads(sys.stdin.read())
    pprint(JSON)
else:
    print("Use this script with a pipe command.")
    print("")
    print("echo '...' | python3 prettyJson.py")
    print("or")
    print("cat ... | python3 prettyJson.py")

Par exemple, avec un flux JSON non formaté:

# cat flux.json
{"time": "2016-06-29 15:54","countryName": "Austria","sunset": "2016-06-29 21:18","rawOffset": 1,"dstOffset": 2,"countryCode": "AT","gmtOffset": 1,"lng": 10.2,"sunrise": "2016-06-29 05:27","timezoneId": "Europe/Vienna","lat": 47.01}

Une fois traité par le script:

# cat flux.json | python3 prettyJson.py
{'countryCode': 'AT',
 'countryName': 'Austria',
 'dstOffset': 2,
 'gmtOffset': 1,
 'lat': 47.01,
 'lng': 10.2,
 'rawOffset': 1,
 'sunrise': '2016-06-29 05:27',
 'sunset': '2016-06-29 21:18',
 'time': '2016-06-29 15:54',
 'timezoneId': 'Europe/Vienna'}

Fonctionne également avec la commande CURL:

# curl "http://api.geonames.org/citiesJSON?formatted=true&north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo&style=full" -o - -s | python3 prettyJson.py
{'geonames': [{'countrycode': 'MX',
               'fcl': 'P',
               'fclName': 'city, village,...',
               'fcode': 'PPLC',
               'fcodeName': 'capital of a political entity',
               'geonameId': 3530597,
               'lat': 19.428472427036,
               'lng': -99.12766456604,
               'name': 'Mexiko-Stadt',
               'population': 12294193,
               'toponymName': 'Mexico City',
               'wikipedia': 'en.wikipedia.org/wiki/Mexico_City'},
              {'countrycode': 'CN',
               'fcl': 'P',
               'fclName': 'city, village,...',
               'fcode': 'PPLC',
               'fcodeName': 'capital of a political entity',
               'geonameId': 1816670,
               'lat': 39.9074977414405,
               'lng': 116.397228240967,
               'name': 'Peking',
               'population': 11716620,
               'toponymName': 'Beijing',
               'wikipedia': 'en.wikipedia.org/wiki/Beijing'}]}
Etiquettes: