при сохранении json в файле появляются лишние символы. python

имеется примерная такая html страница, внутри которой есть json. При сохрании в файл, появляется символ переноса строки \n и экранируются элементы.

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
get_json = (json.dumps(json.loads(js), indent=4, ensure_ascii=False))
print(get_json)

with open("data.json", mode="w") as json_file:
    json.dump(get_json , json_file)

При выводе на экран все красиво:

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

Но файл выглядит вот:

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

Если убрать indent=4, то и \n пропадает. Как можно сохранить файл, что бы он внутри выглядел, так же красиво, как при выводе на экран?


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

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

Вы два раза делаете преобразование.

В get_json у вас уже строка со сформированным json-ом. Второй раз делать json.dump не нужно. Просто пишите в файл:

with open("data.json", mode="w")
    json_file.write(get_json)

Или не делайте сохранения в строку, а сразу пишите в файл:

js = soup.find("script", type="application/ld+json").text
with open("data.json", mode="w") as json_file:
    json.dump(json.loads(js), json_file, indent=4, ensure_ascii=False)
→ Ссылка