Мне нужно создать поддельные документы JSON (многие из них). Структура JSON будет предоставлена образцом JSON один раз, который переводится в схему / класс — автоматически или нет (есть идея?).
Пример для следующего JSON:
{"email": "robin14@chapman-quinn.com", "username": "ryan", "first_name": "Ryan", "last_name": "Ramirez", "phone_number": "3718444137", "optiona_info": {"address": "Unit 2836 Box 8447nDPO AA 19978", "nick": "dummy"}}
Это довольно простой JSON, а код генерирует поддельные данные:
from faker import Faker
import json
class OptionalInfo():
def __init__(self):
fake = Faker()
self.address = fake.address()
self.nick= 'dummy'
def returnJson(self):
return dict (address= self.address ,nick= self.nick)
class PersonalInfo():
def __init__(self):
fake = Faker()
self.email = fake.email()
self.username = fake.first_name()
self.first_name = fake.first_name()
self.last_name = fake.last_name()
self.phone_number = fake.phone_number()
self.OptionalInfo = OptionalInfo()
def returnJson(self):
return {'email': self.email,
'username': self.first_name.lower(),
'first_name': self.first_name,
'last_name': self.last_name,
'phone_number': self.phone_number,
'optional_info': self.OptionalInfo
}
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if hasattr(obj,'returnJson'):
return obj.returnJson()
else:
return json.JSONEncoder.default(self, obj)
def input_data(x):
for i in range(0, x):
personalinfo = PersonalInfo()
print (json.dumps(personalinfo.returnJson(), cls=ComplexEncoder))
def main():
no_of_input = 10
input_data(no_of_input)
main()
Во-первых, мне не нравится идея, что это не универсальное решение. Мне нужно каким-то образом получить эту работу динамически по образцу JSON ⟶ получить правильный класс, оттуда применить логику для подделки полей.
Во-вторых, у меня есть некоторые сомнения, следует ли мне разобраться с этим в более «пидантическом стиле» и получить проверку типа, которая, как я читал, более интуитивно понятна для описания вложенных элементов. С другой стороны, я не уверен, удастся ли применить fake()
работать легко.
Я новичок в pydantic, и, насколько я искал, я не нашел ничего похожего. Если pydantic будет лучшим выбором — с чего мне начать? Буду благодарен за любой пример.