import json import re from dataclasses import dataclass from typing import Optional, Union reasn = re.compile(r"^AS(\d+)$") def parse_asn(value: Union[str, int]) -> Optional[int]: if isinstance(value, int): return value match = reasn.match(value) if match: return int(match.group(1)) @dataclass class ASPA: customer: int providers: list[int] ta: Optional[str] @classmethod def from_dict(cls, d): try: if 'customer' in d: customer = parse_asn(d['customer']) elif 'customer_asid' in d: customer = parse_asn(d['customer_asid']) else: return None providers = list(map(parse_asn, d['providers'])) return cls(customer, providers, d.get('ta')) except (KeyError, TypeError): return None def parse_json(data: str) -> list[ASPA]: data = json.loads(data) return list(filter(None, map(ASPA.from_dict, data.get('aspas', []))))