Предположим, у меня есть действительная строка JSON, которую я хочу сделать частью более крупного объекта JSON. Самое простое решение — проанализировать строку как dict, а затем снова выгрузить ее в JSON:
import json
json_str = '{"name": "Alice", "age": 30}'
# Write the JSON-encoded string to a string
new_json_str = json.dumps({"foo": "bar", "user": json.loads(json_str)})
Можно ли избежать синтаксического анализа и сброса туда и обратно?
Я пытаюсь избежать обратного того, как преобразовать строку json внутри допустимого json в действительный json python
Если посмотреть на спецификацию JSON, то в целом это может сработать. Форматирование может быть ужасным, но мне нелегко придумать противоположный пример.
Это может «работать», но будет очень склонно к созданию неверных результатов, поскольку вы не выполняете никаких проверок ни на одном этапе. Если ваша строка JSON не огромна и ее анализ не занимает заметное количество времени, я бы сказал, просто проанализируйте ее, измените как объект и снова сбросьте. В любом случае, это не то, что вам следует делать слишком часто.
Под «работой» я подразумеваю, что эта процедура создаст действительную строку JSON, если вставленная строка является допустимой JSON и вставлена вместо значения JSON. Это должно быть доказуемо.






Вы можете вставить заполнитель, а затем выполнить простую замену строки.
Чтобы избежать конфликта заполнителя с реальными данными, я присоединяю UUID.
from uuid import uuid4
placeholder = f'PLACEHOLDER_{uuid4()}'
json_with_placeholder = json.dumps({"foo": "bar", "user": placeholder})
new_json_str = json_with_placeholder.replace(json.dumps(placeholder), json_str)
Результат:
'{"foo": "bar", "user": {"name": "Alice", "age": 30}}'
Я не могу придумать никаких предостережений по этому поводу. Учитывая, что json_str является допустимым JSON, я не думаю, что возможно вывести искаженный JSON.
Я могу думать только о плюсах: например, json_str будет сохранен, даже если он не соответствует семантике объектов Python, например, повторяющиеся имена или точность с плавающей запятой, например.
json_str = '{"name": "Alice", "age": 30, "age": 30.00000000000000000001}'
Мне нравится идея uuid. Напишите собственный декодер json, который каждый раз, когда он видит объект, который не может быть преобразован в dict, вместо того, чтобы преобразовать его в json, отправляет его в dict и вставляет заполнитель. Затем мы перебираем шаблон json и заменяем любой заполнитель JSON-представлением объекта.
Для простого примера вы можете просто сделать, например.
f'{{"foo": "bar", "user": {json_str}}}', но для чего-то более сложного вы не можете сказать «не сериализуйте этот бит», нет.