├── .github └── FUNDING.yml ├── .travis.yml ├── CodablePerformance.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── xcshareddata │ └── xcschemes │ └── CodablePerformance.xcscheme ├── LICENSE.md ├── README.md ├── Sources ├── Airport.swift └── Info.plist └── Tests ├── Info.plist ├── JSONFileLoader.swift ├── PerformanceTests.swift ├── airports1.json ├── airports10.json ├── airports100.json ├── airports1000.json └── airports10000.json /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [mattt] 2 | custom: https://flight.school/books/codable 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | xcode_project: CodablePerformance.xcodeproj 3 | xcode_scheme: CodablePerformance 4 | xcode_destination: platform=iOS Simulator,OS=11.4,name=iPad Pro (9.7-inch) 5 | -------------------------------------------------------------------------------- /CodablePerformance.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | F821C3BF208FCB5600F1F40A /* Airport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F821C3B5208FCB5600F1F40A /* Airport.framework */; }; 11 | F821C3C4208FCB5600F1F40A /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F821C3C3208FCB5600F1F40A /* PerformanceTests.swift */; }; 12 | F821C3D2208FCBCE00F1F40A /* Airport.swift in Sources */ = {isa = PBXBuildFile; fileRef = F821C3D1208FCBCE00F1F40A /* Airport.swift */; }; 13 | F84F9339208FD9E3004704FB /* JSONFileLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F84F9338208FD9E3004704FB /* JSONFileLoader.swift */; }; 14 | F884610B20975AF200E095CA /* airports1000.json in Resources */ = {isa = PBXBuildFile; fileRef = F884610820975AF200E095CA /* airports1000.json */; }; 15 | F884610D20975AF200E095CA /* airports100.json in Resources */ = {isa = PBXBuildFile; fileRef = F884610A20975AF200E095CA /* airports100.json */; }; 16 | F884610F20975B0100E095CA /* airports10.json in Resources */ = {isa = PBXBuildFile; fileRef = F884610E20975B0100E095CA /* airports10.json */; }; 17 | F884611120975CB700E095CA /* airports1.json in Resources */ = {isa = PBXBuildFile; fileRef = F884611020975CB700E095CA /* airports1.json */; }; 18 | F8C2FFBE20976228009F8FDA /* airports10000.json in Resources */ = {isa = PBXBuildFile; fileRef = F8C2FFBD20976228009F8FDA /* airports10000.json */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | F821C3C0208FCB5600F1F40A /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = F821C3AC208FCB5600F1F40A /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = F821C3B4208FCB5600F1F40A; 27 | remoteInfo = CodablePerformance; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | F821C3B5208FCB5600F1F40A /* Airport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Airport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | F821C3B9208FCB5600F1F40A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 34 | F821C3BE208FCB5600F1F40A /* Performance Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Performance Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | F821C3C3208FCB5600F1F40A /* PerformanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PerformanceTests.swift; sourceTree = ""; }; 36 | F821C3C5208FCB5600F1F40A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | F821C3D1208FCBCE00F1F40A /* Airport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Airport.swift; sourceTree = ""; }; 38 | F84F9338208FD9E3004704FB /* JSONFileLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONFileLoader.swift; sourceTree = ""; }; 39 | F884610820975AF200E095CA /* airports1000.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = airports1000.json; sourceTree = ""; }; 40 | F884610A20975AF200E095CA /* airports100.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = airports100.json; sourceTree = ""; }; 41 | F884610E20975B0100E095CA /* airports10.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = airports10.json; sourceTree = ""; }; 42 | F884611020975CB700E095CA /* airports1.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = airports1.json; sourceTree = ""; }; 43 | F8C2FFBD20976228009F8FDA /* airports10000.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = airports10000.json; sourceTree = ""; }; 44 | /* End PBXFileReference section */ 45 | 46 | /* Begin PBXFrameworksBuildPhase section */ 47 | F821C3B1208FCB5600F1F40A /* Frameworks */ = { 48 | isa = PBXFrameworksBuildPhase; 49 | buildActionMask = 2147483647; 50 | files = ( 51 | ); 52 | runOnlyForDeploymentPostprocessing = 0; 53 | }; 54 | F821C3BB208FCB5600F1F40A /* Frameworks */ = { 55 | isa = PBXFrameworksBuildPhase; 56 | buildActionMask = 2147483647; 57 | files = ( 58 | F821C3BF208FCB5600F1F40A /* Airport.framework in Frameworks */, 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | /* End PBXFrameworksBuildPhase section */ 63 | 64 | /* Begin PBXGroup section */ 65 | F821C3AB208FCB5600F1F40A = { 66 | isa = PBXGroup; 67 | children = ( 68 | F821C3B7208FCB5600F1F40A /* Sources */, 69 | F821C3C2208FCB5600F1F40A /* Tests */, 70 | F821C3B6208FCB5600F1F40A /* Products */, 71 | ); 72 | sourceTree = ""; 73 | }; 74 | F821C3B6208FCB5600F1F40A /* Products */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | F821C3B5208FCB5600F1F40A /* Airport.framework */, 78 | F821C3BE208FCB5600F1F40A /* Performance Tests.xctest */, 79 | ); 80 | name = Products; 81 | sourceTree = ""; 82 | }; 83 | F821C3B7208FCB5600F1F40A /* Sources */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | F821C3D1208FCBCE00F1F40A /* Airport.swift */, 87 | F821C3B9208FCB5600F1F40A /* Info.plist */, 88 | ); 89 | path = Sources; 90 | sourceTree = ""; 91 | }; 92 | F821C3C2208FCB5600F1F40A /* Tests */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | F821C3C3208FCB5600F1F40A /* PerformanceTests.swift */, 96 | F84F9338208FD9E3004704FB /* JSONFileLoader.swift */, 97 | F884611020975CB700E095CA /* airports1.json */, 98 | F884610E20975B0100E095CA /* airports10.json */, 99 | F884610A20975AF200E095CA /* airports100.json */, 100 | F884610820975AF200E095CA /* airports1000.json */, 101 | F8C2FFBD20976228009F8FDA /* airports10000.json */, 102 | F821C3C5208FCB5600F1F40A /* Info.plist */, 103 | ); 104 | path = Tests; 105 | sourceTree = ""; 106 | }; 107 | /* End PBXGroup section */ 108 | 109 | /* Begin PBXHeadersBuildPhase section */ 110 | F821C3B2208FCB5600F1F40A /* Headers */ = { 111 | isa = PBXHeadersBuildPhase; 112 | buildActionMask = 2147483647; 113 | files = ( 114 | ); 115 | runOnlyForDeploymentPostprocessing = 0; 116 | }; 117 | /* End PBXHeadersBuildPhase section */ 118 | 119 | /* Begin PBXNativeTarget section */ 120 | F821C3B4208FCB5600F1F40A /* Airport */ = { 121 | isa = PBXNativeTarget; 122 | buildConfigurationList = F821C3C9208FCB5700F1F40A /* Build configuration list for PBXNativeTarget "Airport" */; 123 | buildPhases = ( 124 | F821C3B0208FCB5600F1F40A /* Sources */, 125 | F821C3B1208FCB5600F1F40A /* Frameworks */, 126 | F821C3B2208FCB5600F1F40A /* Headers */, 127 | F821C3B3208FCB5600F1F40A /* Resources */, 128 | ); 129 | buildRules = ( 130 | ); 131 | dependencies = ( 132 | ); 133 | name = Airport; 134 | productName = CodablePerformance; 135 | productReference = F821C3B5208FCB5600F1F40A /* Airport.framework */; 136 | productType = "com.apple.product-type.framework"; 137 | }; 138 | F821C3BD208FCB5600F1F40A /* Performance Tests */ = { 139 | isa = PBXNativeTarget; 140 | buildConfigurationList = F821C3CC208FCB5700F1F40A /* Build configuration list for PBXNativeTarget "Performance Tests" */; 141 | buildPhases = ( 142 | F821C3BA208FCB5600F1F40A /* Sources */, 143 | F821C3BB208FCB5600F1F40A /* Frameworks */, 144 | F821C3BC208FCB5600F1F40A /* Resources */, 145 | ); 146 | buildRules = ( 147 | ); 148 | dependencies = ( 149 | F821C3C1208FCB5600F1F40A /* PBXTargetDependency */, 150 | ); 151 | name = "Performance Tests"; 152 | productName = CodablePerformanceTests; 153 | productReference = F821C3BE208FCB5600F1F40A /* Performance Tests.xctest */; 154 | productType = "com.apple.product-type.bundle.unit-test"; 155 | }; 156 | /* End PBXNativeTarget section */ 157 | 158 | /* Begin PBXProject section */ 159 | F821C3AC208FCB5600F1F40A /* Project object */ = { 160 | isa = PBXProject; 161 | attributes = { 162 | LastSwiftUpdateCheck = 0940; 163 | LastUpgradeCheck = 1010; 164 | ORGANIZATIONNAME = "Flight School"; 165 | TargetAttributes = { 166 | F821C3B4208FCB5600F1F40A = { 167 | CreatedOnToolsVersion = 9.4; 168 | LastSwiftMigration = 1010; 169 | }; 170 | F821C3BD208FCB5600F1F40A = { 171 | CreatedOnToolsVersion = 9.4; 172 | LastSwiftMigration = 1010; 173 | }; 174 | }; 175 | }; 176 | buildConfigurationList = F821C3AF208FCB5600F1F40A /* Build configuration list for PBXProject "CodablePerformance" */; 177 | compatibilityVersion = "Xcode 9.3"; 178 | developmentRegion = en; 179 | hasScannedForEncodings = 0; 180 | knownRegions = ( 181 | en, 182 | ); 183 | mainGroup = F821C3AB208FCB5600F1F40A; 184 | productRefGroup = F821C3B6208FCB5600F1F40A /* Products */; 185 | projectDirPath = ""; 186 | projectRoot = ""; 187 | targets = ( 188 | F821C3B4208FCB5600F1F40A /* Airport */, 189 | F821C3BD208FCB5600F1F40A /* Performance Tests */, 190 | ); 191 | }; 192 | /* End PBXProject section */ 193 | 194 | /* Begin PBXResourcesBuildPhase section */ 195 | F821C3B3208FCB5600F1F40A /* Resources */ = { 196 | isa = PBXResourcesBuildPhase; 197 | buildActionMask = 2147483647; 198 | files = ( 199 | ); 200 | runOnlyForDeploymentPostprocessing = 0; 201 | }; 202 | F821C3BC208FCB5600F1F40A /* Resources */ = { 203 | isa = PBXResourcesBuildPhase; 204 | buildActionMask = 2147483647; 205 | files = ( 206 | F884610F20975B0100E095CA /* airports10.json in Resources */, 207 | F884611120975CB700E095CA /* airports1.json in Resources */, 208 | F884610D20975AF200E095CA /* airports100.json in Resources */, 209 | F884610B20975AF200E095CA /* airports1000.json in Resources */, 210 | F8C2FFBE20976228009F8FDA /* airports10000.json in Resources */, 211 | ); 212 | runOnlyForDeploymentPostprocessing = 0; 213 | }; 214 | /* End PBXResourcesBuildPhase section */ 215 | 216 | /* Begin PBXSourcesBuildPhase section */ 217 | F821C3B0208FCB5600F1F40A /* Sources */ = { 218 | isa = PBXSourcesBuildPhase; 219 | buildActionMask = 2147483647; 220 | files = ( 221 | F821C3D2208FCBCE00F1F40A /* Airport.swift in Sources */, 222 | ); 223 | runOnlyForDeploymentPostprocessing = 0; 224 | }; 225 | F821C3BA208FCB5600F1F40A /* Sources */ = { 226 | isa = PBXSourcesBuildPhase; 227 | buildActionMask = 2147483647; 228 | files = ( 229 | F84F9339208FD9E3004704FB /* JSONFileLoader.swift in Sources */, 230 | F821C3C4208FCB5600F1F40A /* PerformanceTests.swift in Sources */, 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | }; 234 | /* End PBXSourcesBuildPhase section */ 235 | 236 | /* Begin PBXTargetDependency section */ 237 | F821C3C1208FCB5600F1F40A /* PBXTargetDependency */ = { 238 | isa = PBXTargetDependency; 239 | target = F821C3B4208FCB5600F1F40A /* Airport */; 240 | targetProxy = F821C3C0208FCB5600F1F40A /* PBXContainerItemProxy */; 241 | }; 242 | /* End PBXTargetDependency section */ 243 | 244 | /* Begin XCBuildConfiguration section */ 245 | F821C3C7208FCB5700F1F40A /* Debug */ = { 246 | isa = XCBuildConfiguration; 247 | buildSettings = { 248 | ALWAYS_SEARCH_USER_PATHS = NO; 249 | CLANG_ANALYZER_NONNULL = YES; 250 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 251 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 252 | CLANG_CXX_LIBRARY = "libc++"; 253 | CLANG_ENABLE_MODULES = YES; 254 | CLANG_ENABLE_OBJC_ARC = YES; 255 | CLANG_ENABLE_OBJC_WEAK = YES; 256 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 257 | CLANG_WARN_BOOL_CONVERSION = YES; 258 | CLANG_WARN_COMMA = YES; 259 | CLANG_WARN_CONSTANT_CONVERSION = YES; 260 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 261 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 262 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 263 | CLANG_WARN_EMPTY_BODY = YES; 264 | CLANG_WARN_ENUM_CONVERSION = YES; 265 | CLANG_WARN_INFINITE_RECURSION = YES; 266 | CLANG_WARN_INT_CONVERSION = YES; 267 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 268 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 269 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 270 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 271 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 272 | CLANG_WARN_STRICT_PROTOTYPES = YES; 273 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 274 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 275 | CLANG_WARN_UNREACHABLE_CODE = YES; 276 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 277 | CODE_SIGN_IDENTITY = "iPhone Developer"; 278 | COPY_PHASE_STRIP = NO; 279 | CURRENT_PROJECT_VERSION = 1; 280 | DEBUG_INFORMATION_FORMAT = dwarf; 281 | ENABLE_STRICT_OBJC_MSGSEND = YES; 282 | ENABLE_TESTABILITY = YES; 283 | GCC_C_LANGUAGE_STANDARD = gnu11; 284 | GCC_DYNAMIC_NO_PIC = NO; 285 | GCC_NO_COMMON_BLOCKS = YES; 286 | GCC_OPTIMIZATION_LEVEL = 0; 287 | GCC_PREPROCESSOR_DEFINITIONS = ( 288 | "DEBUG=1", 289 | "$(inherited)", 290 | ); 291 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 292 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 293 | GCC_WARN_UNDECLARED_SELECTOR = YES; 294 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 295 | GCC_WARN_UNUSED_FUNCTION = YES; 296 | GCC_WARN_UNUSED_VARIABLE = YES; 297 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 298 | MTL_ENABLE_DEBUG_INFO = YES; 299 | ONLY_ACTIVE_ARCH = YES; 300 | SDKROOT = iphoneos; 301 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 302 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 303 | VERSIONING_SYSTEM = "apple-generic"; 304 | VERSION_INFO_PREFIX = ""; 305 | }; 306 | name = Debug; 307 | }; 308 | F821C3C8208FCB5700F1F40A /* Release */ = { 309 | isa = XCBuildConfiguration; 310 | buildSettings = { 311 | ALWAYS_SEARCH_USER_PATHS = NO; 312 | CLANG_ANALYZER_NONNULL = YES; 313 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 314 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 315 | CLANG_CXX_LIBRARY = "libc++"; 316 | CLANG_ENABLE_MODULES = YES; 317 | CLANG_ENABLE_OBJC_ARC = YES; 318 | CLANG_ENABLE_OBJC_WEAK = YES; 319 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 320 | CLANG_WARN_BOOL_CONVERSION = YES; 321 | CLANG_WARN_COMMA = YES; 322 | CLANG_WARN_CONSTANT_CONVERSION = YES; 323 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 324 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 325 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 326 | CLANG_WARN_EMPTY_BODY = YES; 327 | CLANG_WARN_ENUM_CONVERSION = YES; 328 | CLANG_WARN_INFINITE_RECURSION = YES; 329 | CLANG_WARN_INT_CONVERSION = YES; 330 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 331 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 332 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 333 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 334 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 335 | CLANG_WARN_STRICT_PROTOTYPES = YES; 336 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 337 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 338 | CLANG_WARN_UNREACHABLE_CODE = YES; 339 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 340 | CODE_SIGN_IDENTITY = "iPhone Developer"; 341 | COPY_PHASE_STRIP = NO; 342 | CURRENT_PROJECT_VERSION = 1; 343 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 344 | ENABLE_NS_ASSERTIONS = NO; 345 | ENABLE_STRICT_OBJC_MSGSEND = YES; 346 | GCC_C_LANGUAGE_STANDARD = gnu11; 347 | GCC_NO_COMMON_BLOCKS = YES; 348 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 349 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 350 | GCC_WARN_UNDECLARED_SELECTOR = YES; 351 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 352 | GCC_WARN_UNUSED_FUNCTION = YES; 353 | GCC_WARN_UNUSED_VARIABLE = YES; 354 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 355 | MTL_ENABLE_DEBUG_INFO = NO; 356 | SDKROOT = iphoneos; 357 | SWIFT_COMPILATION_MODE = wholemodule; 358 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 359 | VALIDATE_PRODUCT = YES; 360 | VERSIONING_SYSTEM = "apple-generic"; 361 | VERSION_INFO_PREFIX = ""; 362 | }; 363 | name = Release; 364 | }; 365 | F821C3CA208FCB5700F1F40A /* Debug */ = { 366 | isa = XCBuildConfiguration; 367 | buildSettings = { 368 | CLANG_ENABLE_MODULES = YES; 369 | CODE_SIGN_IDENTITY = ""; 370 | CODE_SIGN_STYLE = Automatic; 371 | DEFINES_MODULE = YES; 372 | DYLIB_COMPATIBILITY_VERSION = 1; 373 | DYLIB_CURRENT_VERSION = 1; 374 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 375 | GCC_OPTIMIZATION_LEVEL = s; 376 | INFOPLIST_FILE = Sources/Info.plist; 377 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 378 | LD_RUNPATH_SEARCH_PATHS = ( 379 | "$(inherited)", 380 | "@executable_path/Frameworks", 381 | "@loader_path/Frameworks", 382 | ); 383 | PRODUCT_BUNDLE_IDENTIFIER = "com.flight-school.CodablePerformance"; 384 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 385 | SDKROOT = iphoneos; 386 | SKIP_INSTALL = YES; 387 | SWIFT_COMPILATION_MODE = wholemodule; 388 | SWIFT_DISABLE_SAFETY_CHECKS = NO; 389 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 390 | SWIFT_VERSION = 4.2; 391 | TARGETED_DEVICE_FAMILY = "1,2"; 392 | }; 393 | name = Debug; 394 | }; 395 | F821C3CB208FCB5700F1F40A /* Release */ = { 396 | isa = XCBuildConfiguration; 397 | buildSettings = { 398 | CLANG_ENABLE_MODULES = YES; 399 | CODE_SIGN_IDENTITY = ""; 400 | CODE_SIGN_STYLE = Automatic; 401 | DEFINES_MODULE = YES; 402 | DYLIB_COMPATIBILITY_VERSION = 1; 403 | DYLIB_CURRENT_VERSION = 1; 404 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 405 | INFOPLIST_FILE = Sources/Info.plist; 406 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 407 | LD_RUNPATH_SEARCH_PATHS = ( 408 | "$(inherited)", 409 | "@executable_path/Frameworks", 410 | "@loader_path/Frameworks", 411 | ); 412 | PRODUCT_BUNDLE_IDENTIFIER = "com.flight-school.CodablePerformance"; 413 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 414 | SDKROOT = iphoneos; 415 | SKIP_INSTALL = YES; 416 | SWIFT_DISABLE_SAFETY_CHECKS = NO; 417 | SWIFT_VERSION = 4.2; 418 | TARGETED_DEVICE_FAMILY = "1,2"; 419 | }; 420 | name = Release; 421 | }; 422 | F821C3CD208FCB5700F1F40A /* Debug */ = { 423 | isa = XCBuildConfiguration; 424 | buildSettings = { 425 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 426 | CODE_SIGN_STYLE = Automatic; 427 | INFOPLIST_FILE = Tests/Info.plist; 428 | LD_RUNPATH_SEARCH_PATHS = ( 429 | "$(inherited)", 430 | "@executable_path/Frameworks", 431 | "@loader_path/Frameworks", 432 | ); 433 | PRODUCT_BUNDLE_IDENTIFIER = "com.flight-school.CodablePerformanceTests"; 434 | PRODUCT_NAME = "$(TARGET_NAME)"; 435 | SDKROOT = iphoneos; 436 | SWIFT_VERSION = 4.2; 437 | TARGETED_DEVICE_FAMILY = "1,2"; 438 | }; 439 | name = Debug; 440 | }; 441 | F821C3CE208FCB5700F1F40A /* Release */ = { 442 | isa = XCBuildConfiguration; 443 | buildSettings = { 444 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 445 | CODE_SIGN_STYLE = Automatic; 446 | INFOPLIST_FILE = Tests/Info.plist; 447 | LD_RUNPATH_SEARCH_PATHS = ( 448 | "$(inherited)", 449 | "@executable_path/Frameworks", 450 | "@loader_path/Frameworks", 451 | ); 452 | PRODUCT_BUNDLE_IDENTIFIER = "com.flight-school.CodablePerformanceTests"; 453 | PRODUCT_NAME = "$(TARGET_NAME)"; 454 | SDKROOT = iphoneos; 455 | SWIFT_VERSION = 4.2; 456 | TARGETED_DEVICE_FAMILY = "1,2"; 457 | }; 458 | name = Release; 459 | }; 460 | /* End XCBuildConfiguration section */ 461 | 462 | /* Begin XCConfigurationList section */ 463 | F821C3AF208FCB5600F1F40A /* Build configuration list for PBXProject "CodablePerformance" */ = { 464 | isa = XCConfigurationList; 465 | buildConfigurations = ( 466 | F821C3C7208FCB5700F1F40A /* Debug */, 467 | F821C3C8208FCB5700F1F40A /* Release */, 468 | ); 469 | defaultConfigurationIsVisible = 0; 470 | defaultConfigurationName = Release; 471 | }; 472 | F821C3C9208FCB5700F1F40A /* Build configuration list for PBXNativeTarget "Airport" */ = { 473 | isa = XCConfigurationList; 474 | buildConfigurations = ( 475 | F821C3CA208FCB5700F1F40A /* Debug */, 476 | F821C3CB208FCB5700F1F40A /* Release */, 477 | ); 478 | defaultConfigurationIsVisible = 0; 479 | defaultConfigurationName = Release; 480 | }; 481 | F821C3CC208FCB5700F1F40A /* Build configuration list for PBXNativeTarget "Performance Tests" */ = { 482 | isa = XCConfigurationList; 483 | buildConfigurations = ( 484 | F821C3CD208FCB5700F1F40A /* Debug */, 485 | F821C3CE208FCB5700F1F40A /* Release */, 486 | ); 487 | defaultConfigurationIsVisible = 0; 488 | defaultConfigurationName = Release; 489 | }; 490 | /* End XCConfigurationList section */ 491 | }; 492 | rootObject = F821C3AC208FCB5600F1F40A /* Project object */; 493 | } 494 | -------------------------------------------------------------------------------- /CodablePerformance.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CodablePerformance.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /CodablePerformance.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /CodablePerformance.xcodeproj/xcshareddata/xcschemes/CodablePerformance.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2018 Read Evaluate Press, LLC 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a 4 | copy of this software and associated documentation files (the "Software"), 5 | to deal in the Software without restriction, including without limitation 6 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 7 | and/or sell copies of the Software, and to permit persons to whom the 8 | Software is furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 14 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 19 | DEALINGS IN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Codable vs. JSONSerialization Performance 2 | 3 | Swift Codable can automatically synthesize initializers that decode models from JSON. 4 | But how does this generated code compare to what it replaces? 5 | 6 | Read the full article [here](https://flight.school/articles/benchmarking-codable/). 7 | 8 | ## License 9 | 10 | MIT 11 | 12 | ## Contact 13 | 14 | Mattt ([@mattt](https://twitter.com/mattt)) 15 | -------------------------------------------------------------------------------- /Sources/Airport.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public struct Airport: Codable { 4 | let name: String 5 | let iata: String 6 | let icao: String 7 | let coordinates: [Double] 8 | 9 | public struct Runway: Codable { 10 | enum Surface: String, Codable { 11 | case rigid, flexible, gravel, sealed, unpaved, other 12 | } 13 | 14 | let direction: String 15 | let distance: Int 16 | let surface: Surface 17 | } 18 | 19 | let runways: [Runway] 20 | } 21 | 22 | extension Airport { 23 | public init(json: [String: Any]) { 24 | guard let name = json["name"] as? String, 25 | let iata = json["iata"] as? String, 26 | let icao = json["icao"] as? String, 27 | let coordinates = json["coordinates"] as? [Double], 28 | let runways = json["runways"] as? [[String: Any]] 29 | else { 30 | fatalError("Cannot initialize Airport from JSON") 31 | } 32 | 33 | self.name = name 34 | self.iata = iata 35 | self.icao = icao 36 | self.coordinates = coordinates 37 | self.runways = runways.map { Runway(json: $0) } 38 | } 39 | } 40 | 41 | extension Airport.Runway { 42 | public init(json: [String: Any]) { 43 | guard let direction = json["direction"] as? String, 44 | let distance = json["distance"] as? Int, 45 | let surfaceRawValue = json["surface"] as? String, 46 | let surface = Surface(rawValue: surfaceRawValue) 47 | else { 48 | fatalError("Cannot initialize Runway from JSON") 49 | } 50 | 51 | self.direction = direction 52 | self.distance = distance 53 | self.surface = surface 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Sources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Tests/JSONFileLoader.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | func airportsJSON(count: Int) -> Data { 4 | let bundle = Bundle(for: PerformanceTests.self) 5 | let resource = "airports\(count)" 6 | guard let url = bundle.url(forResource: resource, withExtension: "json"), 7 | let data = try? Data(contentsOf: url) else { 8 | fatalError() 9 | } 10 | 11 | return data 12 | } 13 | -------------------------------------------------------------------------------- /Tests/PerformanceTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import Foundation 3 | @testable import Airport 4 | 5 | let count = 10000 // 1, 10, 100, 1000, or 10000 6 | let data = airportsJSON(count: count) 7 | 8 | class PerformanceTests: XCTestCase { 9 | override class var defaultPerformanceMetrics: [XCTPerformanceMetric] { 10 | return [ 11 | XCTPerformanceMetric(rawValue: "com.apple.XCTPerformanceMetric_WallClockTime"), 12 | XCTPerformanceMetric(rawValue: "com.apple.XCTPerformanceMetric_TransientHeapAllocationsKilobytes") 13 | ] 14 | } 15 | 16 | func testPerformanceCodable() { 17 | self.measure { 18 | let decoder = JSONDecoder() 19 | let airports = try! decoder.decode([Airport].self, from: data) 20 | XCTAssertEqual(airports.count, count) 21 | } 22 | } 23 | 24 | func testPerformanceJSONSerialization() { 25 | self.measure { 26 | let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [[String: Any]] 27 | let airports = json.map{ Airport(json: $0) } 28 | XCTAssertEqual(airports.count, count) 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Tests/airports1.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "Anaa Airport", 3 | "iata": "AAA", 4 | "icao": "NTGA", 5 | "coordinates": [-145.51222222222222, -17.348888888888887], 6 | "runways": [{ 7 | "direction": "14L/32R", 8 | "distance": 1502, 9 | "surface": "flexible" 10 | }] 11 | } 12 | ] 13 | -------------------------------------------------------------------------------- /Tests/airports10.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "Anaa Airport", 3 | "iata": "AAA", 4 | "icao": "NTGA", 5 | "coordinates": [-145.51222222222222, -17.348888888888887], 6 | "runways": [{ 7 | "direction": "14L/32R", 8 | "distance": 1502, 9 | "surface": "flexible" 10 | }] 11 | }, 12 | { 13 | "name": "Arrabury Airport", 14 | "iata": "AAB", 15 | "icao": "YARY", 16 | "coordinates": [ 17 | 141.04666666666665, -26.69 18 | ], 19 | "runways": [{ 20 | "direction": "16/34", 21 | "distance": 1144, 22 | "surface": "unpaved" 23 | }] 24 | }, 25 | { 26 | "name": "El Arish International Airport", 27 | "iata": "AAC", 28 | "icao": "HEAR", 29 | "coordinates": [ 30 | 33.83583333333333, 31 | 31.073333333333334 32 | ], 33 | "runways": [{ 34 | "direction": "16/34", 35 | "distance": 3019, 36 | "surface": "flexible" 37 | }] 38 | }, 39 | { 40 | "name": "Rabah Bitat Airport", 41 | "iata": "AAE", 42 | "icao": "DABB", 43 | "coordinates": [ 44 | 7.813888888888889, 45 | 36.82916666666667 46 | ], 47 | "runways": [{ 48 | "direction": "01/19", 49 | "distance": 3000, 50 | "surface": "flexible" 51 | }, 52 | { 53 | "direction": "05/23", 54 | "distance": 2290, 55 | "surface": "flexible" 56 | } 57 | ] 58 | }, 59 | { 60 | "name": "Apalachicola Regional Airport", 61 | "iata": "AAF", 62 | "icao": "KAAF", 63 | "coordinates": [-85.0275, 64 | 29.7275 65 | ], 66 | "runways": [{ 67 | "direction": "6/24", 68 | "distance": 1607, 69 | "surface": "rigid" 70 | }, 71 | { 72 | "direction": "13/31", 73 | "distance": 1601, 74 | "surface": "rigid" 75 | }, 76 | { 77 | "direction": "18/36", 78 | "distance": 1601, 79 | "surface": "rigid" 80 | } 81 | ] 82 | }, 83 | { 84 | "name": "Avelino Vieira Airport", 85 | "iata": "AAG", 86 | "icao": "SSYA", 87 | "coordinates": [-49.79055555555556, -24.104166666666668], 88 | "runways": [{ 89 | "direction": "05/23", 90 | "distance": 1400, 91 | "surface": "flexible" 92 | }] 93 | }, 94 | { 95 | "name": "Aachen-Merzbrück Airfield", 96 | "iata": "AAH", 97 | "icao": "EDKA", 98 | "coordinates": [ 99 | 6.186388888888889, 100 | 50.82333333333334 101 | ], 102 | "runways": [{ 103 | "direction": "08/26", 104 | "distance": 520, 105 | "surface": "flexible" 106 | }] 107 | }, 108 | { 109 | "name": "Arraias Airport", 110 | "iata": "AAI", 111 | "icao": "SWRA", 112 | "coordinates": [-46.885555555555555, -13.023888888888889], 113 | "runways": [{ 114 | "direction": "15/33", 115 | "distance": 1500, 116 | "surface": "flexible" 117 | }] 118 | }, 119 | { 120 | "name": "Cayana Airstrip", 121 | "iata": "AAJ", 122 | "icao": "SMCA", 123 | "coordinates": [-55.57777777777778, 124 | 3.8986111111111112 125 | ], 126 | "runways": [{ 127 | "direction": "07/25", 128 | "distance": 500, 129 | "surface": "unpaved" 130 | }] 131 | }, 132 | { 133 | "name": "Aranuka Airport", 134 | "iata": "AAK", 135 | "icao": "NGUK", 136 | "coordinates": [ 137 | 173.6363888888889, 138 | 0.18527777777777776 139 | ], 140 | "runways": [{ 141 | "direction": "", 142 | "distance": 90221, 143 | "surface": "other" 144 | }] 145 | } 146 | ] 147 | -------------------------------------------------------------------------------- /Tests/airports100.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Anaa Airport", 4 | "iata": "AAA", 5 | "icao": "NTGA", 6 | "coordinates": [ 7 | -145.51222222222222, 8 | -17.348888888888887 9 | ], 10 | "runways": [ 11 | { 12 | "direction": "14L/32R", 13 | "distance": 1502, 14 | "surface": "flexible" 15 | } 16 | ] 17 | }, 18 | { 19 | "name": "Arrabury Airport", 20 | "iata": "AAB", 21 | "icao": "YARY", 22 | "coordinates": [ 23 | 141.04666666666665, 24 | -26.69 25 | ], 26 | "runways": [ 27 | { 28 | "direction": "16/34", 29 | "distance": 1144, 30 | "surface": "unpaved" 31 | } 32 | ] 33 | }, 34 | { 35 | "name": "El Arish International Airport", 36 | "iata": "AAC", 37 | "icao": "HEAR", 38 | "coordinates": [ 39 | 33.83583333333333, 40 | 31.073333333333334 41 | ], 42 | "runways": [ 43 | { 44 | "direction": "16/34", 45 | "distance": 3019, 46 | "surface": "flexible" 47 | } 48 | ] 49 | }, 50 | { 51 | "name": "Rabah Bitat Airport", 52 | "iata": "AAE", 53 | "icao": "DABB", 54 | "coordinates": [ 55 | 7.813888888888889, 56 | 36.82916666666667 57 | ], 58 | "runways": [ 59 | { 60 | "direction": "01/19", 61 | "distance": 3000, 62 | "surface": "flexible" 63 | }, 64 | { 65 | "direction": "05/23", 66 | "distance": 2290, 67 | "surface": "flexible" 68 | } 69 | ] 70 | }, 71 | { 72 | "name": "Apalachicola Regional Airport", 73 | "iata": "AAF", 74 | "icao": "KAAF", 75 | "coordinates": [ 76 | -85.0275, 77 | 29.7275 78 | ], 79 | "runways": [ 80 | { 81 | "direction": "6/24", 82 | "distance": 1607, 83 | "surface": "rigid" 84 | }, 85 | { 86 | "direction": "13/31", 87 | "distance": 1601, 88 | "surface": "rigid" 89 | }, 90 | { 91 | "direction": "18/36", 92 | "distance": 1601, 93 | "surface": "rigid" 94 | } 95 | ] 96 | }, 97 | { 98 | "name": "Avelino Vieira Airport", 99 | "iata": "AAG", 100 | "icao": "SSYA", 101 | "coordinates": [ 102 | -49.79055555555556, 103 | -24.104166666666668 104 | ], 105 | "runways": [ 106 | { 107 | "direction": "05/23", 108 | "distance": 1400, 109 | "surface": "flexible" 110 | } 111 | ] 112 | }, 113 | { 114 | "name": "Aachen-Merzbrück Airfield", 115 | "iata": "AAH", 116 | "icao": "EDKA", 117 | "coordinates": [ 118 | 6.186388888888889, 119 | 50.82333333333334 120 | ], 121 | "runways": [ 122 | { 123 | "direction": "08/26", 124 | "distance": 520, 125 | "surface": "flexible" 126 | } 127 | ] 128 | }, 129 | { 130 | "name": "Arraias Airport", 131 | "iata": "AAI", 132 | "icao": "SWRA", 133 | "coordinates": [ 134 | -46.885555555555555, 135 | -13.023888888888889 136 | ], 137 | "runways": [ 138 | { 139 | "direction": "15/33", 140 | "distance": 1500, 141 | "surface": "flexible" 142 | } 143 | ] 144 | }, 145 | { 146 | "name": "Cayana Airstrip", 147 | "iata": "AAJ", 148 | "icao": "SMCA", 149 | "coordinates": [ 150 | -55.57777777777778, 151 | 3.8986111111111112 152 | ], 153 | "runways": [ 154 | { 155 | "direction": "07/25", 156 | "distance": 500, 157 | "surface": "unpaved" 158 | } 159 | ] 160 | }, 161 | { 162 | "name": "Aranuka Airport", 163 | "iata": "AAK", 164 | "icao": "NGUK", 165 | "coordinates": [ 166 | 173.6363888888889, 167 | 0.18527777777777776 168 | ], 169 | "runways": [ 170 | { 171 | "direction": "", 172 | "distance": 90221, 173 | "surface": "other" 174 | } 175 | ] 176 | }, 177 | { 178 | "name": "Aalborg Airport", 179 | "iata": "AAL", 180 | "icao": "EKYT", 181 | "coordinates": [ 182 | 9.849166666666667, 183 | 57.09277777777778 184 | ], 185 | "runways": [ 186 | { 187 | "direction": "08L/26R", 188 | "distance": 2654, 189 | "surface": "flexible" 190 | }, 191 | { 192 | "direction": "08R/26L", 193 | "distance": 2549, 194 | "surface": "flexible" 195 | } 196 | ] 197 | }, 198 | { 199 | "name": "Mala Mala Airport", 200 | "iata": "AAM", 201 | "icao": "FAMD", 202 | "coordinates": [ 203 | 31.544722222222223, 204 | -24.818055555555556 205 | ], 206 | "runways": [ 207 | { 208 | "direction": "16/34", 209 | "distance": 1263, 210 | "surface": "flexible" 211 | } 212 | ] 213 | }, 214 | { 215 | "name": "Al-Ain International Airport", 216 | "iata": "AAN", 217 | "icao": "OMAL", 218 | "coordinates": [ 219 | 55.60916666666667, 220 | 24.261666666666667 221 | ], 222 | "runways": [ 223 | { 224 | "direction": "01/19", 225 | "distance": 4000, 226 | "surface": "flexible" 227 | } 228 | ] 229 | }, 230 | { 231 | "name": "Anaco Airport", 232 | "iata": "AAO", 233 | "icao": "SVAN", 234 | "coordinates": [ 235 | -64.47083333333333, 236 | 9.430277777777777 237 | ], 238 | "runways": [ 239 | { 240 | "direction": "10/28", 241 | "distance": 1260, 242 | "surface": "flexible" 243 | } 244 | ] 245 | }, 246 | { 247 | "name": "Anapa Airport", 248 | "iata": "AAQ", 249 | "icao": "URKA", 250 | "coordinates": [ 251 | 37.34730555555556, 252 | 45.00208333333333 253 | ], 254 | "runways": [ 255 | { 256 | "direction": "04/22", 257 | "distance": 2500, 258 | "surface": "rigid" 259 | } 260 | ] 261 | }, 262 | { 263 | "name": "Aarhus Airport", 264 | "iata": "AAR", 265 | "icao": "EKAH", 266 | "coordinates": [ 267 | 10.619166666666667, 268 | 56.30416666666667 269 | ], 270 | "runways": [ 271 | { 272 | "direction": "10L/28R", 273 | "distance": 2777, 274 | "surface": "flexible" 275 | }, 276 | { 277 | "direction": "10R/28L", 278 | "distance": 2702, 279 | "surface": "flexible" 280 | } 281 | ] 282 | }, 283 | { 284 | "name": "Apalapsili Airport", 285 | "iata": "AAS", 286 | "icao": "", 287 | "coordinates": [ 288 | 139.31055555555557, 289 | -3.8847222222222224 290 | ], 291 | "runways": [ 292 | { 293 | "direction": "", 294 | "distance": 900, 295 | "surface": "other" 296 | } 297 | ] 298 | }, 299 | { 300 | "name": "Altay Airport", 301 | "iata": "AAT", 302 | "icao": "ZWAT", 303 | "coordinates": [ 304 | 88.08444444444444, 305 | 47.75036111111111 306 | ], 307 | "runways": [ 308 | { 309 | "direction": "11/29", 310 | "distance": 1750, 311 | "surface": "rigid" 312 | } 313 | ] 314 | }, 315 | { 316 | "name": "Asau Airport", 317 | "iata": "AAU", 318 | "icao": "NSAU", 319 | "coordinates": [ 320 | -172.6277777777778, 321 | -13.505 322 | ], 323 | "runways": [] 324 | }, 325 | { 326 | "name": "Allah Valley Airport", 327 | "iata": "AAV", 328 | "icao": "RPMA", 329 | "coordinates": [ 330 | 124.75252222222223, 331 | 6.367769444444444 332 | ], 333 | "runways": [ 334 | { 335 | "direction": "16/34", 336 | "distance": 1340, 337 | "surface": "flexible" 338 | } 339 | ] 340 | }, 341 | { 342 | "name": "Romeu Zema Airport", 343 | "iata": "AAX", 344 | "icao": "SBAX", 345 | "coordinates": [ 346 | -46.96555555555556, 347 | -19.560555555555556 348 | ], 349 | "runways": [ 350 | { 351 | "direction": "15/33", 352 | "distance": 1900, 353 | "surface": "flexible" 354 | } 355 | ] 356 | }, 357 | { 358 | "name": "Al Ghaydha Airport", 359 | "iata": "AAY", 360 | "icao": "OYGD", 361 | "coordinates": [ 362 | 52.17419444444444, 363 | 16.193361111111113 364 | ], 365 | "runways": [ 366 | { 367 | "direction": "08/26", 368 | "distance": 2700, 369 | "surface": "flexible" 370 | } 371 | ] 372 | }, 373 | { 374 | "name": "Los Altos Airport", 375 | "iata": "AAZ", 376 | "icao": "MGQZ", 377 | "coordinates": [ 378 | -91.50194444444445, 379 | 14.865555555555556 380 | ], 381 | "runways": [ 382 | { 383 | "direction": "05/23", 384 | "distance": 2103, 385 | "surface": "flexible" 386 | } 387 | ] 388 | }, 389 | { 390 | "name": "Abakan International Airport", 391 | "iata": "ABA", 392 | "icao": "UNAA", 393 | "coordinates": [ 394 | 91.38583333333334, 395 | 53.74333333333333 396 | ], 397 | "runways": [ 398 | { 399 | "direction": "02/20", 400 | "distance": 3250, 401 | "surface": "rigid" 402 | } 403 | ] 404 | }, 405 | { 406 | "name": "Asaba International Airport", 407 | "iata": "ABB", 408 | "icao": "DNAS", 409 | "coordinates": [ 410 | 6.665277777777778, 411 | 6.204166666666667 412 | ], 413 | "runways": [ 414 | { 415 | "direction": "11/29", 416 | "distance": 3400, 417 | "surface": "flexible" 418 | } 419 | ] 420 | }, 421 | { 422 | "name": "Albacete Airport", 423 | "iata": "ABC", 424 | "icao": "LEAB", 425 | "coordinates": [ 426 | -1.8633333333333335, 427 | 38.94833333333333 428 | ], 429 | "runways": [ 430 | { 431 | "direction": "09/27", 432 | "distance": 2700, 433 | "surface": "flexible" 434 | } 435 | ] 436 | }, 437 | { 438 | "name": "Abadan International Airport", 439 | "iata": "ABD", 440 | "icao": "OIAA", 441 | "coordinates": [ 442 | 48.23305555555556, 443 | 30.36527777777778 444 | ], 445 | "runways": [ 446 | { 447 | "direction": "14R/32L", 448 | "distance": 3101, 449 | "surface": "flexible" 450 | }, 451 | { 452 | "direction": "14L/32R", 453 | "distance": 2265, 454 | "surface": "flexible" 455 | } 456 | ] 457 | }, 458 | { 459 | "name": "Lehigh Valley International Airport", 460 | "iata": "ABE", 461 | "icao": "KABE", 462 | "coordinates": [ 463 | -75.44047222222223, 464 | 40.65233333333333 465 | ], 466 | "runways": [ 467 | { 468 | "direction": "06/24", 469 | "distance": 2316, 470 | "surface": "flexible" 471 | }, 472 | { 473 | "direction": "13/31", 474 | "distance": 1767, 475 | "surface": "flexible" 476 | } 477 | ] 478 | }, 479 | { 480 | "name": "Abaiang Atoll Airport", 481 | "iata": "ABF", 482 | "icao": "NGAB", 483 | "coordinates": [ 484 | 173.0402777777778, 485 | 1.7963888888888888 486 | ], 487 | "runways": [ 488 | { 489 | "direction": "", 490 | "distance": 885, 491 | "surface": "other" 492 | } 493 | ] 494 | }, 495 | { 496 | "name": "Abingdon Airport", 497 | "iata": "ABG", 498 | "icao": "YABI", 499 | "coordinates": [ 500 | 143.1836111111111, 501 | -17.6075 502 | ], 503 | "runways": [ 504 | { 505 | "direction": "n/a", 506 | "distance": 1300, 507 | "surface": "other" 508 | }, 509 | { 510 | "direction": "n/a", 511 | "distance": 700, 512 | "surface": "other" 513 | } 514 | ] 515 | }, 516 | { 517 | "name": "Alpha Airport", 518 | "iata": "ABH", 519 | "icao": "YAPH", 520 | "coordinates": [ 521 | 146.58333333333334, 522 | -23.646666666666665 523 | ], 524 | "runways": [ 525 | { 526 | "direction": "18/36", 527 | "distance": 1456, 528 | "surface": "flexible" 529 | } 530 | ] 531 | }, 532 | { 533 | "name": "Abilene Regional Airport", 534 | "iata": "ABI", 535 | "icao": "KABI", 536 | "coordinates": [ 537 | -99.68311111111112, 538 | 32.41325 539 | ], 540 | "runways": [ 541 | { 542 | "direction": "4/22", 543 | "distance": 1121, 544 | "surface": "flexible" 545 | }, 546 | { 547 | "direction": "17L/35R", 548 | "distance": 2194, 549 | "surface": "flexible" 550 | }, 551 | { 552 | "direction": "17R/35L", 553 | "distance": 2195, 554 | "surface": "flexible" 555 | } 556 | ] 557 | }, 558 | { 559 | "name": "Port Bouet Airport", 560 | "iata": "ABJ", 561 | "icao": "DIAP", 562 | "coordinates": [ 563 | -3.925777777777778, 564 | 5.261416666666666 565 | ], 566 | "runways": [ 567 | { 568 | "direction": "03/21", 569 | "distance": 3000, 570 | "surface": "other" 571 | } 572 | ] 573 | }, 574 | { 575 | "name": "Kabri Dar Airport", 576 | "iata": "ABK", 577 | "icao": "HAKD", 578 | "coordinates": [ 579 | 44.24155555555556, 580 | 6.732805555555555 581 | ], 582 | "runways": [] 583 | }, 584 | { 585 | "name": "Ambler Airport", 586 | "iata": "ABL", 587 | "icao": "PAFM", 588 | "coordinates": [ 589 | -157.8571111111111, 590 | 67.10663888888888 591 | ], 592 | "runways": [ 593 | { 594 | "direction": "01/19", 595 | "distance": 1219, 596 | "surface": "gravel" 597 | }, 598 | { 599 | "direction": "10/28", 600 | "distance": 735, 601 | "surface": "gravel" 602 | } 603 | ] 604 | }, 605 | { 606 | "name": "Northern Peninsula Airport", 607 | "iata": "ABM", 608 | "icao": "YNPE", 609 | "coordinates": [ 610 | 142.45944444444444, 611 | -10.950833333333332 612 | ], 613 | "runways": [ 614 | { 615 | "direction": "13/31", 616 | "distance": 1834, 617 | "surface": "flexible" 618 | } 619 | ] 620 | }, 621 | { 622 | "name": "Albina Airstrip", 623 | "iata": "ABN", 624 | "icao": "SMBN", 625 | "coordinates": [ 626 | -54.05, 627 | 5.513888888888889 628 | ], 629 | "runways": [ 630 | { 631 | "direction": "04/22", 632 | "distance": 760, 633 | "surface": "unpaved" 634 | } 635 | ] 636 | }, 637 | { 638 | "name": "Aboisso Airport", 639 | "iata": "ABO", 640 | "icao": "DIAO", 641 | "coordinates": [ 642 | -3.2347222222222225, 643 | 5.461944444444445 644 | ], 645 | "runways": [ 646 | { 647 | "direction": "", 648 | "distance": 590, 649 | "surface": "other" 650 | } 651 | ] 652 | }, 653 | { 654 | "name": "Atkamba Airport", 655 | "iata": "ABP", 656 | "icao": "", 657 | "coordinates": [ 658 | 141.1, 659 | -6.066666666666666 660 | ], 661 | "runways": [ 662 | { 663 | "direction": "17/35", 664 | "distance": 519, 665 | "surface": "other" 666 | } 667 | ] 668 | }, 669 | { 670 | "name": "Albuquerque International Sunport", 671 | "iata": "ABQ", 672 | "icao": "KABQ", 673 | "coordinates": [ 674 | -106.61077777777777, 675 | 35.03933333333333 676 | ], 677 | "runways": [ 678 | { 679 | "direction": "3/21", 680 | "distance": 3048, 681 | "surface": "rigid" 682 | }, 683 | { 684 | "direction": "8/26", 685 | "distance": 4204, 686 | "surface": "rigid" 687 | }, 688 | { 689 | "direction": "12/30", 690 | "distance": 1829, 691 | "surface": "rigid" 692 | } 693 | ] 694 | }, 695 | { 696 | "name": "Aberdeen Regional Airport\nAberdeen Army Airfield", 697 | "iata": "ABR", 698 | "icao": "KABR", 699 | "coordinates": [ 700 | -98.42275000000001, 701 | 45.448277777777776 702 | ], 703 | "runways": [ 704 | { 705 | "direction": "13/31", 706 | "distance": 2103, 707 | "surface": "rigid" 708 | }, 709 | { 710 | "direction": "17/35", 711 | "distance": 1676, 712 | "surface": "flexible" 713 | } 714 | ] 715 | }, 716 | { 717 | "name": "Abu Simbel Airport", 718 | "iata": "ABS", 719 | "icao": "HEBL", 720 | "coordinates": [ 721 | 31.61163888888889, 722 | 22.37591666666667 723 | ], 724 | "runways": [ 725 | { 726 | "direction": "15/33", 727 | "distance": 3000, 728 | "surface": "flexible" 729 | } 730 | ] 731 | }, 732 | { 733 | "name": "Al-Baha Domestic Airport", 734 | "iata": "ABT", 735 | "icao": "OEBA", 736 | "coordinates": [ 737 | 41.634166666666665, 738 | 20.296111111111113 739 | ], 740 | "runways": [ 741 | { 742 | "direction": "07/25", 743 | "distance": 3350, 744 | "surface": "flexible" 745 | } 746 | ] 747 | }, 748 | { 749 | "name": "Haliwen Airport", 750 | "iata": "ABU", 751 | "icao": "WATA", 752 | "coordinates": [ 753 | 124.90333333333334, 754 | -9.074722222222222 755 | ], 756 | "runways": [ 757 | { 758 | "direction": "08/26", 759 | "distance": 1500, 760 | "surface": "other" 761 | } 762 | ] 763 | }, 764 | { 765 | "name": "Nnamdi Azikiwe International Airport", 766 | "iata": "ABV", 767 | "icao": "DNAA", 768 | "coordinates": [ 769 | 7.263055555555556, 770 | 9.006666666666666 771 | ], 772 | "runways": [ 773 | { 774 | "direction": "04/22", 775 | "distance": 3610, 776 | "surface": "flexible" 777 | } 778 | ] 779 | }, 780 | { 781 | "name": "Abau AirportAbau AirportAbau Airport", 782 | "iata": "ABW", 783 | "icao": "", 784 | "coordinates": [ 785 | 148.7, 786 | -10.166666666666666 787 | ], 788 | "runways": [ 789 | { 790 | "direction": "", 791 | "distance": 762, 792 | "surface": "other" 793 | } 794 | ] 795 | }, 796 | { 797 | "name": "Albury Airport", 798 | "iata": "ABX", 799 | "icao": "YMAY", 800 | "coordinates": [ 801 | 146.95833333333331, 802 | -36.068333333333335 803 | ], 804 | "runways": [ 805 | { 806 | "direction": "07/25", 807 | "distance": 1900, 808 | "surface": "flexible" 809 | } 810 | ] 811 | }, 812 | { 813 | "name": "Southwest Georgia Regional Airport", 814 | "iata": "ABY", 815 | "icao": "KABY", 816 | "coordinates": [ 817 | -84.19444444444444, 818 | 31.535555555555558 819 | ], 820 | "runways": [ 821 | { 822 | "direction": "4/22", 823 | "distance": 2012, 824 | "surface": "flexible" 825 | }, 826 | { 827 | "direction": "16/34", 828 | "distance": 1591, 829 | "surface": "flexible" 830 | } 831 | ] 832 | }, 833 | { 834 | "name": "Aberdeen International Airport", 835 | "iata": "ABZ", 836 | "icao": "EGPD", 837 | "coordinates": [ 838 | -2.1980555555555554, 839 | 57.2025 840 | ], 841 | "runways": [ 842 | { 843 | "direction": "16/34", 844 | "distance": 1953, 845 | "surface": "flexible" 846 | } 847 | ] 848 | }, 849 | { 850 | "name": "General Juan N. Álvarez International Airport", 851 | "iata": "ACA", 852 | "icao": "MMAA", 853 | "coordinates": [ 854 | -99.75161111111112, 855 | 16.756027777777778 856 | ], 857 | "runways": [ 858 | { 859 | "direction": "06/24", 860 | "distance": 1700, 861 | "surface": "rigid" 862 | }, 863 | { 864 | "direction": "10/28", 865 | "distance": 3302, 866 | "surface": "rigid" 867 | } 868 | ] 869 | }, 870 | { 871 | "name": "Antrim County Airport", 872 | "iata": "ACB", 873 | "icao": "KACB", 874 | "coordinates": [ 875 | -85.19833333333334, 876 | 44.98861111111111 877 | ], 878 | "runways": [ 879 | { 880 | "direction": "2/20", 881 | "distance": 1524, 882 | "surface": "flexible" 883 | } 884 | ] 885 | }, 886 | { 887 | "name": "Kotoka International Airport\nAccra Air Force Station", 888 | "iata": "ACC", 889 | "icao": "DGAA", 890 | "coordinates": [ 891 | -0.1673888888888889, 892 | 5.604666666666667 893 | ], 894 | "runways": [ 895 | { 896 | "direction": "03/21", 897 | "distance": 3403, 898 | "surface": "flexible" 899 | } 900 | ] 901 | }, 902 | { 903 | "name": "Alcides Fernández Airport", 904 | "iata": "ACD", 905 | "icao": "SKAD", 906 | "coordinates": [ 907 | -77.27388888888889, 908 | 8.498055555555554 909 | ], 910 | "runways": [ 911 | { 912 | "direction": "17/35", 913 | "distance": 118915, 914 | "surface": "flexible" 915 | } 916 | ] 917 | }, 918 | { 919 | "name": "Lanzarote Airport", 920 | "iata": "ACE", 921 | "icao": "GCRR", 922 | "coordinates": [ 923 | -13.605277777777777, 924 | 28.945555555555554 925 | ], 926 | "runways": [ 927 | { 928 | "direction": "03/21", 929 | "distance": 2400, 930 | "surface": "flexible" 931 | } 932 | ] 933 | }, 934 | { 935 | "name": "St. Gallen–Altenrhein Airport", 936 | "iata": "ACH", 937 | "icao": "LSZR", 938 | "coordinates": [ 939 | 9.561111111111112, 940 | 47.485527777777776 941 | ], 942 | "runways": [ 943 | { 944 | "direction": "10R/28L", 945 | "distance": 1500, 946 | "surface": "flexible" 947 | }, 948 | { 949 | "direction": "10L/28R", 950 | "distance": 600, 951 | "surface": "unpaved" 952 | } 953 | ] 954 | }, 955 | { 956 | "name": "Alderney Airport", 957 | "iata": "ACI", 958 | "icao": "EGJA", 959 | "coordinates": [ 960 | -2.2144444444444447, 961 | 49.70666666666667 962 | ], 963 | "runways": [ 964 | { 965 | "direction": "08/26", 966 | "distance": 877, 967 | "surface": "flexible" 968 | }, 969 | { 970 | "direction": "13/31", 971 | "distance": 733, 972 | "surface": "unpaved" 973 | }, 974 | { 975 | "direction": "03/21", 976 | "distance": 497, 977 | "surface": "unpaved" 978 | } 979 | ] 980 | }, 981 | { 982 | "name": "Anuradhapura Airport\nSLAF Base Anuradhapura", 983 | "iata": "ACJ", 984 | "icao": "VCCA", 985 | "coordinates": [ 986 | 80.42861111111111, 987 | 8.301666666666668 988 | ], 989 | "runways": [ 990 | { 991 | "direction": "5/23", 992 | "distance": 1630, 993 | "surface": "other" 994 | } 995 | ] 996 | }, 997 | { 998 | "name": "Nantucket Memorial Airport", 999 | "iata": "ACK", 1000 | "icao": "KACK", 1001 | "coordinates": [ 1002 | -70.059, 1003 | 41.25288888888889 1004 | ], 1005 | "runways": [ 1006 | { 1007 | "direction": "6/24", 1008 | "distance": 1921, 1009 | "surface": "flexible" 1010 | }, 1011 | { 1012 | "direction": "12/30", 1013 | "distance": 822, 1014 | "surface": "flexible" 1015 | }, 1016 | { 1017 | "direction": "15/33", 1018 | "distance": 1219, 1019 | "surface": "flexible" 1020 | } 1021 | ] 1022 | }, 1023 | { 1024 | "name": "Aguaclara Airport", 1025 | "iata": "ACL", 1026 | "icao": "", 1027 | "coordinates": [ 1028 | -72.99055555555556, 1029 | 4.746944444444445 1030 | ], 1031 | "runways": [ 1032 | { 1033 | "direction": "", 1034 | "distance": 800, 1035 | "surface": "other" 1036 | } 1037 | ] 1038 | }, 1039 | { 1040 | "name": "Ciudad Acuña International Airport", 1041 | "iata": "ACN", 1042 | "icao": "MMCC", 1043 | "coordinates": [ 1044 | -101.10083333333333, 1045 | 29.333888888888886 1046 | ], 1047 | "runways": [ 1048 | { 1049 | "direction": "13/31", 1050 | "distance": 1801, 1051 | "surface": "flexible" 1052 | } 1053 | ] 1054 | }, 1055 | { 1056 | "name": "Sahand Airport of Maragheh", 1057 | "iata": "ACP", 1058 | "icao": "OITM", 1059 | "coordinates": [ 1060 | 46.12788888888889, 1061 | 37.347972222222225 1062 | ], 1063 | "runways": [ 1064 | { 1065 | "direction": "08/26", 1066 | "distance": 2930, 1067 | "surface": "flexible" 1068 | } 1069 | ] 1070 | }, 1071 | { 1072 | "name": "Araracuara Airport", 1073 | "iata": "ACR", 1074 | "icao": "SKAC", 1075 | "coordinates": [ 1076 | -72.39805555555556, 1077 | -0.6008333333333333 1078 | ], 1079 | "runways": [ 1080 | { 1081 | "direction": "11/29", 1082 | "distance": 1280, 1083 | "surface": "gravel" 1084 | } 1085 | ] 1086 | }, 1087 | { 1088 | "name": "Achinsk Airport", 1089 | "iata": "ACS", 1090 | "icao": "UNKS", 1091 | "coordinates": [ 1092 | 90.57666666666667, 1093 | 56.26833333333333 1094 | ], 1095 | "runways": [ 1096 | { 1097 | "direction": "08/26", 1098 | "distance": 2450, 1099 | "surface": "rigid" 1100 | } 1101 | ] 1102 | }, 1103 | { 1104 | "name": "Waco Regional Airport", 1105 | "iata": "ACT", 1106 | "icao": "KACT", 1107 | "coordinates": [ 1108 | -97.23055555555555, 1109 | 31.61138888888889 1110 | ], 1111 | "runways": [ 1112 | { 1113 | "direction": "1/19", 1114 | "distance": 2010, 1115 | "surface": "flexible" 1116 | }, 1117 | { 1118 | "direction": "14/32", 1119 | "distance": 1797, 1120 | "surface": "flexible" 1121 | } 1122 | ] 1123 | }, 1124 | { 1125 | "name": "Achutupo Airport", 1126 | "iata": "ACU", 1127 | "icao": "", 1128 | "coordinates": [ 1129 | -77.99444444444444, 1130 | 9.190277777777778 1131 | ], 1132 | "runways": [ 1133 | { 1134 | "direction": "17/35", 1135 | "distance": 650, 1136 | "surface": "rigid" 1137 | } 1138 | ] 1139 | }, 1140 | { 1141 | "name": "California Redwood Coast - Humboldt County Airport", 1142 | "iata": "ACV", 1143 | "icao": "KACV", 1144 | "coordinates": [ 1145 | -124.10833333333333, 1146 | 40.97777777777778 1147 | ], 1148 | "runways": [ 1149 | { 1150 | "direction": "14/32", 1151 | "distance": 1843, 1152 | "surface": "flexible" 1153 | }, 1154 | { 1155 | "direction": "1/19", 1156 | "distance": 1372, 1157 | "surface": "flexible" 1158 | } 1159 | ] 1160 | }, 1161 | { 1162 | "name": "Xingyi Wanfenglin Airport", 1163 | "iata": "ACX", 1164 | "icao": "ZUYI", 1165 | "coordinates": [ 1166 | 104.95861111111111, 1167 | 25.08833333333333 1168 | ], 1169 | "runways": [ 1170 | { 1171 | "direction": "16/34", 1172 | "distance": 2300, 1173 | "surface": "other" 1174 | } 1175 | ] 1176 | }, 1177 | { 1178 | "name": "Atlantic City International Airport", 1179 | "iata": "ACY", 1180 | "icao": "KACY", 1181 | "coordinates": [ 1182 | -74.57722222222222, 1183 | 39.4575 1184 | ], 1185 | "runways": [ 1186 | { 1187 | "direction": "4/22", 1188 | "distance": 1873, 1189 | "surface": "flexible" 1190 | }, 1191 | { 1192 | "direction": "13/31", 1193 | "distance": 3048, 1194 | "surface": "flexible" 1195 | } 1196 | ] 1197 | }, 1198 | { 1199 | "name": "Zabol Airport", 1200 | "iata": "ACZ", 1201 | "icao": "OIZB", 1202 | "coordinates": [ 1203 | 61.54388888888889, 1204 | 31.098333333333333 1205 | ], 1206 | "runways": [ 1207 | { 1208 | "direction": "16/34", 1209 | "distance": 3002, 1210 | "surface": "flexible" 1211 | } 1212 | ] 1213 | }, 1214 | { 1215 | "name": "Adana Airport", 1216 | "iata": "ADA", 1217 | "icao": "LTAF", 1218 | "coordinates": [ 1219 | 35.280277777777776, 1220 | 36.981944444444444 1221 | ], 1222 | "runways": [ 1223 | { 1224 | "direction": "05/23", 1225 | "distance": 2750, 1226 | "surface": "flexible" 1227 | } 1228 | ] 1229 | }, 1230 | { 1231 | "name": "İzmir Adnan Menderes Airport", 1232 | "iata": "ADB", 1233 | "icao": "LTBJ", 1234 | "coordinates": [ 1235 | 27.154999999999998, 1236 | 38.4225 1237 | ], 1238 | "runways": [ 1239 | { 1240 | "direction": "16R/34L", 1241 | "distance": 3240, 1242 | "surface": "rigid" 1243 | }, 1244 | { 1245 | "direction": "16L/34R", 1246 | "distance": 3240, 1247 | "surface": "other" 1248 | } 1249 | ] 1250 | }, 1251 | { 1252 | "name": "Andakombe Airport", 1253 | "iata": "ADC", 1254 | "icao": "AYAN", 1255 | "coordinates": [ 1256 | 145.74471944444443, 1257 | -7.137219444444445 1258 | ], 1259 | "runways": [ 1260 | { 1261 | "direction": "", 1262 | "distance": 762, 1263 | "surface": "other" 1264 | } 1265 | ] 1266 | }, 1267 | { 1268 | "name": "Addis Ababa\nBole International Airport", 1269 | "iata": "ADD", 1270 | "icao": "HAAB", 1271 | "coordinates": [ 1272 | 38.79944444444444, 1273 | 8.977777777777778 1274 | ], 1275 | "runways": [ 1276 | { 1277 | "direction": "07R/25L", 1278 | "distance": 3800, 1279 | "surface": "flexible" 1280 | }, 1281 | { 1282 | "direction": "07L/25R", 1283 | "distance": 3700, 1284 | "surface": "flexible" 1285 | } 1286 | ] 1287 | }, 1288 | { 1289 | "name": "Aden International Airport", 1290 | "iata": "ADE", 1291 | "icao": "OYAA", 1292 | "coordinates": [ 1293 | 45.028888888888886, 1294 | 12.829444444444444 1295 | ], 1296 | "runways": [ 1297 | { 1298 | "direction": "08/26", 1299 | "distance": 3100, 1300 | "surface": "flexible" 1301 | } 1302 | ] 1303 | }, 1304 | { 1305 | "name": "Adıyaman Airport", 1306 | "iata": "ADF", 1307 | "icao": "LTCP", 1308 | "coordinates": [ 1309 | 38.46888888888889, 1310 | 37.73166666666667 1311 | ], 1312 | "runways": [ 1313 | { 1314 | "direction": "05/23", 1315 | "distance": 2500, 1316 | "surface": "rigid" 1317 | } 1318 | ] 1319 | }, 1320 | { 1321 | "name": "Lenawee County Airport", 1322 | "iata": "ADG", 1323 | "icao": "KADG", 1324 | "coordinates": [ 1325 | -84.07722222222222, 1326 | 41.867777777777775 1327 | ], 1328 | "runways": [ 1329 | { 1330 | "direction": "5/23", 1331 | "distance": 1524, 1332 | "surface": "flexible" 1333 | }, 1334 | { 1335 | "direction": "11/29", 1336 | "distance": 552, 1337 | "surface": "other" 1338 | } 1339 | ] 1340 | }, 1341 | { 1342 | "name": "Aldan Airport", 1343 | "iata": "ADH", 1344 | "icao": "UEEA", 1345 | "coordinates": [ 1346 | 125.40722222222223, 1347 | 58.60305555555556 1348 | ], 1349 | "runways": [ 1350 | { 1351 | "direction": "06/24", 1352 | "distance": 1376, 1353 | "surface": "flexible" 1354 | } 1355 | ] 1356 | }, 1357 | { 1358 | "name": "Arandis Airport", 1359 | "iata": "ADI", 1360 | "icao": "FYAR", 1361 | "coordinates": [ 1362 | 14.98, 1363 | -22.46222222222222 1364 | ], 1365 | "runways": [ 1366 | { 1367 | "direction": "10/28", 1368 | "distance": 1920, 1369 | "surface": "flexible" 1370 | } 1371 | ] 1372 | }, 1373 | { 1374 | "name": "Amman Civil Airport", 1375 | "iata": "ADJ", 1376 | "icao": "OJAM", 1377 | "coordinates": [ 1378 | 35.99138888888889, 1379 | 31.972499999999997 1380 | ], 1381 | "runways": [ 1382 | { 1383 | "direction": "06/24", 1384 | "distance": 3275, 1385 | "surface": "flexible" 1386 | } 1387 | ] 1388 | }, 1389 | { 1390 | "name": "Adak Airport", 1391 | "iata": "ADK", 1392 | "icao": "PADK", 1393 | "coordinates": [ 1394 | -176.6461111111111, 1395 | 51.878055555555555 1396 | ], 1397 | "runways": [ 1398 | { 1399 | "direction": "5/23", 1400 | "distance": 2374, 1401 | "surface": "flexible" 1402 | } 1403 | ] 1404 | }, 1405 | { 1406 | "name": "Adelaide Airport", 1407 | "iata": "ADL", 1408 | "icao": "YPAD", 1409 | "coordinates": [ 1410 | 138.53055555555557, 1411 | -34.94499999999999 1412 | ], 1413 | "runways": [ 1414 | { 1415 | "direction": "05/23", 1416 | "distance": 3100, 1417 | "surface": "flexible" 1418 | }, 1419 | { 1420 | "direction": "12/30", 1421 | "distance": 1652, 1422 | "surface": "flexible" 1423 | } 1424 | ] 1425 | }, 1426 | { 1427 | "name": "Ardmore Municipal Airport", 1428 | "iata": "ADM", 1429 | "icao": "KADM", 1430 | "coordinates": [ 1431 | -97.02055555555556, 1432 | 34.30416666666667 1433 | ], 1434 | "runways": [ 1435 | { 1436 | "direction": "13/31", 1437 | "distance": 2744, 1438 | "surface": "rigid" 1439 | }, 1440 | { 1441 | "direction": "17/35", 1442 | "distance": 1631, 1443 | "surface": "flexible" 1444 | } 1445 | ] 1446 | }, 1447 | { 1448 | "name": "Andamooka Airport", 1449 | "iata": "ADO", 1450 | "icao": "YAMK", 1451 | "coordinates": [ 1452 | 137.13666666666666, 1453 | -30.438333333333333 1454 | ], 1455 | "runways": [ 1456 | { 1457 | "direction": "17/35", 1458 | "distance": 725, 1459 | "surface": "other" 1460 | } 1461 | ] 1462 | }, 1463 | { 1464 | "name": "Ampara Airport\nSLAF Ampara", 1465 | "iata": "ADP", 1466 | "icao": "VCCG", 1467 | "coordinates": [ 1468 | 81.63027777777778, 1469 | 7.336944444444444 1470 | ], 1471 | "runways": [ 1472 | { 1473 | "direction": "07/25", 1474 | "distance": 1097, 1475 | "surface": "other" 1476 | } 1477 | ] 1478 | }, 1479 | { 1480 | "name": "Kodiak Benny Benson State Airport", 1481 | "iata": "ADQ", 1482 | "icao": "PADQ", 1483 | "coordinates": [ 1484 | -152.49388888888888, 1485 | 57.749722222222225 1486 | ], 1487 | "runways": [ 1488 | { 1489 | "direction": "7/25", 1490 | "distance": 2296, 1491 | "surface": "flexible" 1492 | }, 1493 | { 1494 | "direction": "11/29", 1495 | "distance": 1646, 1496 | "surface": "flexible" 1497 | }, 1498 | { 1499 | "direction": "18/36", 1500 | "distance": 1527, 1501 | "surface": "flexible" 1502 | } 1503 | ] 1504 | }, 1505 | { 1506 | "name": "Robert F. Swinnie Airport", 1507 | "iata": "ADR", 1508 | "icao": "KPHH", 1509 | "coordinates": [ 1510 | -79.5261111111111, 1511 | 33.45166666666667 1512 | ], 1513 | "runways": [ 1514 | { 1515 | "direction": "18/36", 1516 | "distance": 915, 1517 | "surface": "flexible" 1518 | } 1519 | ] 1520 | }, 1521 | { 1522 | "name": "Addison Airport", 1523 | "iata": "ADS", 1524 | "icao": "KADS", 1525 | "coordinates": [ 1526 | -96.83638888888889, 1527 | 32.968611111111116 1528 | ], 1529 | "runways": [ 1530 | { 1531 | "direction": "15/33", 1532 | "distance": 2195, 1533 | "surface": "rigid" 1534 | } 1535 | ] 1536 | }, 1537 | { 1538 | "name": "Ada Municipal Airport", 1539 | "iata": "ADT", 1540 | "icao": "KADH", 1541 | "coordinates": [ 1542 | -96.6713888888889, 1543 | 34.80444444444444 1544 | ], 1545 | "runways": [ 1546 | { 1547 | "direction": "17/35", 1548 | "distance": 1891, 1549 | "surface": "flexible" 1550 | }, 1551 | { 1552 | "direction": "13/31", 1553 | "distance": 946, 1554 | "surface": "flexible" 1555 | } 1556 | ] 1557 | }, 1558 | { 1559 | "name": "Ardabil Airport", 1560 | "iata": "ADU", 1561 | "icao": "OITL", 1562 | "coordinates": [ 1563 | 48.424166666666665, 1564 | 38.32555555555556 1565 | ], 1566 | "runways": [ 1567 | { 1568 | "direction": "15/33", 1569 | "distance": 3298, 1570 | "surface": "flexible" 1571 | }, 1572 | { 1573 | "direction": "07/25", 1574 | "distance": 2500, 1575 | "surface": "other" 1576 | } 1577 | ] 1578 | }, 1579 | { 1580 | "name": "Ed Daein Airport", 1581 | "iata": "ADV", 1582 | "icao": "", 1583 | "coordinates": [ 1584 | 26.11916666666667, 1585 | 11.403611111111111 1586 | ], 1587 | "runways": [ 1588 | { 1589 | "direction": "", 1590 | "distance": 1000, 1591 | "surface": "other" 1592 | } 1593 | ] 1594 | }, 1595 | { 1596 | "name": "Andrews FieldAndrews FieldAirfield information", 1597 | "iata": "ADW", 1598 | "icao": "KADW", 1599 | "coordinates": [ 1600 | -76.86694444444444, 1601 | 38.81083333333333 1602 | ], 1603 | "runways": [ 1604 | { 1605 | "direction": "01L/19R", 1606 | "distance": 2835, 1607 | "surface": "rigid" 1608 | }, 1609 | { 1610 | "direction": "01R/19L", 1611 | "distance": 2973, 1612 | "surface": "flexible" 1613 | } 1614 | ] 1615 | }, 1616 | { 1617 | "name": "Leuchars Station", 1618 | "iata": "", 1619 | "icao": "", 1620 | "coordinates": [ 1621 | -2.868611111111111, 1622 | 56.37305555555555 1623 | ], 1624 | "runways": [ 1625 | 1626 | ] 1627 | }, 1628 | { 1629 | "name": "Alldays Airport", 1630 | "iata": "ADY", 1631 | "icao": "FAAL", 1632 | "coordinates": [ 1633 | 29.055, 1634 | -22.678333333333335 1635 | ], 1636 | "runways": [ 1637 | { 1638 | "direction": "10/28", 1639 | "distance": 1450, 1640 | "surface": "flexible" 1641 | } 1642 | ] 1643 | }, 1644 | { 1645 | "name": "Gustavo Rojas Pinilla International Airport", 1646 | "iata": "ADZ", 1647 | "icao": "SKSP", 1648 | "coordinates": [ 1649 | -81.71111111111111, 1650 | 12.58361111111111 1651 | ], 1652 | "runways": [ 1653 | { 1654 | "direction": "06/24", 1655 | "distance": 2380, 1656 | "surface": "other" 1657 | } 1658 | ] 1659 | }, 1660 | { 1661 | "name": "Abemama Atoll Airport", 1662 | "iata": "AEA", 1663 | "icao": "NGTB", 1664 | "coordinates": [ 1665 | 173.82861111111112, 1666 | 0.49083333333333334 1667 | ], 1668 | "runways": [ 1669 | { 1670 | "direction": "", 1671 | "distance": 1244, 1672 | "surface": "other" 1673 | } 1674 | ] 1675 | }, 1676 | { 1677 | "name": "Baise Bama Airport", 1678 | "iata": "AEB", 1679 | "icao": "ZGBS", 1680 | "coordinates": [ 1681 | 106.95916666666668, 1682 | 23.71944444444444 1683 | ], 1684 | "runways": [ 1685 | { 1686 | "direction": "12/30", 1687 | "distance": 2500, 1688 | "surface": "rigid" 1689 | } 1690 | ] 1691 | }, 1692 | { 1693 | "name": "Aek Godang Airport", 1694 | "iata": "AEG", 1695 | "icao": "WIME", 1696 | "coordinates": [ 1697 | 99.43045277777779, 1698 | 1.4001027777777777 1699 | ], 1700 | "runways": [ 1701 | { 1702 | "direction": "11/29", 1703 | "distance": 1396, 1704 | "surface": "flexible" 1705 | } 1706 | ] 1707 | }, 1708 | { 1709 | "name": "Abéché Airport", 1710 | "iata": "AEH", 1711 | "icao": "FTTC", 1712 | "coordinates": [ 1713 | 20.844166666666666, 1714 | 13.846944444444444 1715 | ], 1716 | "runways": [ 1717 | { 1718 | "direction": "09/27", 1719 | "distance": 2800, 1720 | "surface": "flexible" 1721 | } 1722 | ] 1723 | }, 1724 | { 1725 | "name": "Albert Lea Municipal Airport", 1726 | "iata": "AEL", 1727 | "icao": "KAEL", 1728 | "coordinates": [ 1729 | -93.36805555555554, 1730 | 43.68111111111111 1731 | ], 1732 | "runways": [ 1733 | { 1734 | "direction": "17/35", 1735 | "distance": 1524, 1736 | "surface": "flexible" 1737 | }, 1738 | { 1739 | "direction": "5/23", 1740 | "distance": 883, 1741 | "surface": "flexible" 1742 | } 1743 | ] 1744 | }, 1745 | { 1746 | "name": "Aioun el Atrouss Airport", 1747 | "iata": "AEO", 1748 | "icao": "GQNA", 1749 | "coordinates": [ 1750 | -9.637777777777778, 1751 | 16.711111111111112 1752 | ], 1753 | "runways": [ 1754 | { 1755 | "direction": "04/22", 1756 | "distance": 1599, 1757 | "surface": "flexible" 1758 | } 1759 | ] 1760 | } 1761 | ] 1762 | --------------------------------------------------------------------------------