goodvibration
goodvibration

Reputation: 6206

In JSON output, force every opening curly brace to appear in a new separate line

With json.dumps(some_dict,indent=4,sort_keys=True) in my code:

I get something like this:

{
    "a": {
        "x":1,
        "y":2
    },
    "b": {
        "z":3,
        "w":4
    }
}

But I want something like this:

{
    "a":
    {
        "x":1,
        "y":2
    },
    "b":
    {
        "z":3,
        "w":4
    }
}

How can I force each opening curly brace to appear at the beginning of a new separate line?

Do I have to write my own JSON serializer, or is there a special argument that I can use when calling json.dumps?

Upvotes: 7

Views: 3223

Answers (2)

CanProgram
CanProgram

Reputation: 373

Building on Barmar's excellent answer, here's a more complete demo showing how you can convert and customize your JSON in Python:

import json
import re


# JSONifies dict and saves it to file
def save(data, filename):

    with open(filename, "w") as write_file:

        write_file.write(jsonify(data))


# Converts Python dict to a JSON string. Indents with tabs and puts opening
# braces on their own line.
def jsonify(data):

    default_json = json.dumps(data, indent = '\t')

    better_json = re.sub(
        r'^((\s*)".*?":)\s*([\[{])',
        r'\1\n\2\3',
        default_json,
        flags=re.MULTILINE
    )

    return better_json


# Sample data for demo
data = {
    "president":
    {
        "name": "Zaphod Beeblebrox",
        "species": "Betelgeusian"
    }
}

filename = 'test.json'


# Demo
print("Here's your pretty JSON:")
print(jsonify(data))
print()
print('Saving to file:', filename)
save(data, filename)

Upvotes: 3

Barmar
Barmar

Reputation: 782693

You can use a regular expression replacement on the result.

better_json = re.sub(r'^((\s*)".*?":)\s*([\[{])', r'\1\n\2\3', json, flags=re.MULTILINE)

The first capture group matches everything up to the : after the property name, the second capture group matches the whitespace before the property name, and the third capture group captures the { or [ before the object or array. The whitespace is then copied after the newline, so that the indentation will match properly.

DEMO

Upvotes: 8

Related Questions