from pydantic import BaseModel, Field import json class RegionNames(BaseModel): full_name: str = Field(alias='fullName') short_name: str = Field(alias='shortName') display_name: str = Field(alias='displayName') primary_display_name: str = Field(alias='primaryDisplayName') secondary_display_name: str = Field(alias='secondaryDisplayName') last_search_name: str = Field(alias='lastSearchName') class EssId(BaseModel): source_name: str = Field(alias='sourceName') source_id: int = Field(alias='sourceId') class Country(BaseModel): name: str iso_code2: str = Field(alias='isoCode2') iso_code3: str = Field(alias='isoCode3') class HierarchyInfo(BaseModel): country: Country class Coordinates(BaseModel): latitude: float = Field(alias='lat') longitude: float = Field(alias='long') class GaiaRegionResult(BaseModel): index: int gaia_id: int = Field(alias='gaiaId') type: str region_names: RegionNames = Field(alias='regionNames') ess_id: EssId = Field(alias='essId') coordinates: Coordinates hierarchy_info: HierarchyInfo = Field(alias='hierarchyInfo') class SearchResults(BaseModel): query: str = Field(alias='q') request_id: str = Field(alias='rid') request_status: str = Field(alias='rc') search_results: list[GaiaRegionResult] = Field(alias='sr') if __name__ == "__main__": with open('locations_v3_search_example.json', 'r', encoding='utf-8') as json_file: data = json.load(json_file) results = SearchResults(**data) print('\n'.join( [result.region_names.full_name for result in results.search_results if result.type in ('CITY', 'NEIGHBORHOOD')]) )