How to prettyprint a JSON file?

前端 未结 13 823
滥情空心
滥情空心 2020-11-22 01:53

I have a JSON file that is a mess that I want to prettyprint. What\'s the easiest way to do this in Python?

I know PrettyPrint takes an \"object\", which I think can

相关标签:
13条回答
  • 2020-11-22 02:03

    Use this function and don't sweat having to remember if your JSON is a str or dict again - just look at the pretty print:

    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)
    
    0 讨论(0)
  • 2020-11-22 02:05

    You could try pprintjson.


    Installation

    $ pip3 install pprintjson
    

    Usage

    Pretty print JSON from a file using the pprintjson CLI.

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

    Pretty print JSON from a stdin using the pprintjson CLI.

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

    Pretty print JSON from a string using the pprintjson CLI.

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

    Pretty print JSON from a string with an indent of 1.

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

    Pretty print JSON from a string and save output to a file output.json.

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

    Output

    0 讨论(0)
  • 2020-11-22 02:07

    I think that's better to parse the json before, to avoid errors:

    def format_response(response):
        try:
            parsed = json.loads(response.text)
        except JSONDecodeError:
            return response.text
        return json.dumps(parsed, ensure_ascii=True, indent=4)
    
    0 讨论(0)
  • 2020-11-22 02:12

    The json module already implements some basic pretty printing with the indent parameter that specifies how many spaces to indent by:

    >>> 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
            ]
        }
    ]
    

    To parse a file, use json.load():

    with open('filename.txt', 'r') as handle:
        parsed = json.load(handle)
    
    0 讨论(0)
  • 2020-11-22 02:12

    You can do this on the command line:

    python3 -m json.tool some.json
    

    (as already mentioned in the commentaries to the question, thanks to @Kai Petzke for the python3 suggestion).

    Actually python is not my favourite tool as far as json processing on the command line is concerned. For simple pretty printing is ok, but if you want to manipulate the json it can become overcomplicated. You'd soon need to write a separate script-file, you could end up with maps whose keys are u"some-key" (python unicode), which makes selecting fields more difficult and doesn't really go in the direction of pretty-printing.

    You can also use jq:

    jq . some.json
    

    and you get colors as a bonus (and way easier extendability).

    Addendum: There is some confusion in the comments about using jq to process large JSON files on the one hand, and having a very large jq program on the other. For pretty-printing a file consisting of a single large JSON entity, the practical limitation is RAM. For pretty-printing a 2GB file consisting of a single array of real-world data, the "maximum resident set size" required for pretty-printing was 5GB (whether using jq 1.5 or 1.6). Note also that jq can be used from within python after pip install jq.

    0 讨论(0)
  • 2020-11-22 02:16

    Use pprint: https://docs.python.org/3.6/library/pprint.html

    import pprint
    pprint.pprint(json)
    

    print() compared to 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'}
    
    0 讨论(0)
提交回复
热议问题