\n\n```\ndriver_standings.json\n[\n {\n \"season\": \"2019\",\n \"round\": \"3\",\n \"DriverStandings\": [\n {\n \"position\": \"1\",\n \"positionText\": \"1\",\n \"points\": \"68\",\n \"wins\": \"2\",\n \"Driver\": {\n \"driverId\": \"hamilton\",\n \"permanentNumber\": \"44\",\n \"code\": \"HAM\",\n \"url\": \"http://en.wikipedia.org/wiki/Lewis_Hamilton\",\n \"givenName\": \"Lewis\",\n \"familyName\": \"Hamilton\",\n \"dateOfBirth\": \"1985-01-07\",\n \"nationality\": \"British\"\n },\n \"Constructors\": [\n {\n \"constructorId\": \"mercedes\",\n \"url\": \"http://en.wikipedia.org/wiki/Mercedes-Benz_in_Formula_One\",\n \"name\": \"Mercedes\",\n \"nationality\": \"German\"\n }\n ]\n },\n ...\n ]\n }\n]\n```\n\n```\njson2models -f attrs -l DriverStandings driver_standings.json\n```\n\n```python\nimport attr\nfrom json_to_models.dynamic_typing import IntString, IsoDateString\nfrom typing import List\n\n\n@attr.s\nclass DriverStandings:\n @attr.s\n class DriverStanding:\n @attr.s\n class Driver:\n driver_id: str = attr.ib()\n permanent_number: IntString = attr.ib(converter=IntString)\n code: str = attr.ib()\n url: str = attr.ib()\n given_name: str = attr.ib()\n family_name: str = attr.ib()\n date_of_birth: IsoDateString = attr.ib(converter=IsoDateString)\n nationality: str = attr.ib()\n \n @attr.s\n class Constructor:\n constructor_id: str = attr.ib()\n url: str = attr.ib()\n name: str = attr.ib()\n nationality: str = attr.ib()\n \n position: IntString = attr.ib(converter=IntString)\n position_text: IntString = attr.ib(converter=IntString)\n points: IntString = attr.ib(converter=IntString)\n wins: IntString = attr.ib(converter=IntString)\n driver: 'Driver' = attr.ib()\n constructors: List['Constructor'] = attr.ib()\n\n season: IntString = attr.ib(converter=IntString)\n round: IntString = attr.ib(converter=IntString)\n driver_standings: List['DriverStanding'] = attr.ib()\n```\n\n
\n\n\n`swagger.json` from any online API (I tested file generated by drf-yasg and another one for Spotify API)\n\nIt requires a lit bit of tweaking:\n* Some fields store routes/models specs as dicts\n* There is a lot of optinal fields so we reduce merging threshold \n\n```\njson_to_models -s flat -f dataclasses -m Swagger testing_tools/swagger.json \n --dict-keys-fields securityDefinitions paths responses definitions properties \n --merge percent_50 number\n```\n\n```python\nfrom dataclasses import dataclass, field\nfrom json_to_models.dynamic_typing import FloatString\nfrom typing import Any, Dict, List, Optional, Union\n\n\n@dataclass\nclass Swagger:\n swagger: FloatString\n info: 'Info'\n host: str\n schemes: List[str]\n base_path: str\n consumes: List[str]\n produces: List[str]\n security_definitions: Dict[str, 'Parameter_SecurityDefinition']\n security: List['Security']\n paths: Dict[str, 'Path']\n definitions: Dict[str, 'Definition_Schema']\n\n\n@dataclass\nclass Info:\n title: str\n description: str\n version: str\n\n\n@dataclass\nclass Security:\n api_key: Optional[List[Any]] = field(default_factory=list)\n basic: Optional[List[Any]] = field(default_factory=list)\n\n\n@dataclass\nclass Path:\n parameters: List['Parameter_SecurityDefinition']\n post: Optional['Delete_Get_Patch_Post_Put'] = None\n get: Optional['Delete_Get_Patch_Post_Put'] = None\n put: Optional['Delete_Get_Patch_Post_Put'] = None\n patch: Optional['Delete_Get_Patch_Post_Put'] = None\n delete: Optional['Delete_Get_Patch_Post_Put'] = None\n\n\n@dataclass\nclass Property:\n type: str\n format: Optional[str] = None\n xnullable: Optional[bool] = None\n items: Optional['Item_Schema'] = None\n\n\n@dataclass\nclass Property_2E:\n type: str\n title: Optional[str] = None\n read_only: Optional[bool] = None\n max_length: Optional[int] = None\n min_length: Optional[int] = None\n items: Optional['Item'] = None\n enum: Optional[List[str]] = field(default_factory=list)\n maximum: Optional[int] = None\n minimum: Optional[int] = None\n format: Optional[str] = None\n\n\n@dataclass\nclass Item:\n ref: Optional[str] = None\n title: Optional[str] = None\n type: Optional[str] = None\n max_length: Optional[int] = None\n min_length: Optional[int] = None\n\n\n@dataclass\nclass Parameter_SecurityDefinition:\n name: str\n in_: str\n required: Optional[bool] = None\n schema: Optional['Item_Schema'] = None\n type: Optional[str] = None\n description: Optional[str] = None\n\n\n@dataclass\nclass Delete_Get_Patch_Post_Put:\n operation_id: str\n description: str\n parameters: List['Parameter_SecurityDefinition']\n responses: Dict[str, 'Response']\n tags: List[str]\n\n\n@dataclass\nclass Item_Schema:\n ref: str\n\n\n@dataclass\nclass Response:\n description: str\n schema: Optional[Union['Item_Schema', 'Definition_Schema']] = None\n\n\n@dataclass\nclass Definition_Schema:\n ref: Optional[str] = None\n required: Optional[List[str]] = field(default_factory=list)\n type: Optional[str] = None\n properties: Optional[Dict[str, Union['Property_2E', 'Property']]] = field(default_factory=dict)\n```\n\n
\n