дозапись в json данных с отступами при помощи python

как при сохранении данных в json файл, сохранить форматирование:

from bs4 import BeautifulSoup
import json
html_block = str('''<div class="microformat"><script type="application/ld+json">[{"@context":"http://schema.org","@type":"MusicEvent","name":"Artist"}]</script></div>''')
soup = BeautifulSoup(html_block, "html.parser")
js = soup.find("script", type="application/ld+json").text

try:
    data_json = json.load(open("data.json"))
except:
    data_json = []

data_json.append(js)
with open("data.json", mode="w") as json_file:
    json.dump((data_json), json_file, indent=4, ensure_ascii=False)

После двух запусков скрипта.

Ожидание:

[
    {
        "@context": "http://schema.org",
        "@type": "MusicEvent",
        "name": "Artist"
    },
    {
        "@context": "http://schema.org",
        "@type": "MusicEvent",
        "name": "Artist"
    }
]

Реальность:

[
    "[{\"@context\":\"http://schema.org\",\"@type\":\"MusicEvent\",\"name\":\"Artist\"}]",
    "[{\"@context\":\"http://schema.org\",\"@type\":\"MusicEvent\",\"name\":\"Artist\"}]"
]

Ответы (1 шт):

Автор решения: Roman Konoval

У вас в переменной js хранится строка. Вы ее добавляете в список, и вас получается список с элементами-строками. Это вы и наблюдаете.

Нужно строку преобразовать в объекты:

js_str = soup.find("script", type="application/ld+json").text

js = json.loads(js_str)

try:
    data = json.load(open("data.json"))
except:
    data = []

data.extend(js) # так как у вас в js_str строка уже со списком,
                # то в js будет список элементов, и добавлять из него
                # эелементы в результат нужно с помощью extend
with open("data.json", mode="w") as json_file:
    json.dump(data, json_file, indent=4, ensure_ascii=False)
→ Ссылка